AI 基础知识八 词嵌入(word embedding)

自然语言

自然语言处理( Natural Language Processing, NLP)简称NLP,属于人工智能的一个分支,让计算机能够理解并处理人类语言,从中提取出有用的信息,帮助人类更高效地处理各种任务。

  1. 最早的自然语言处理是机器翻译

2.随着互联网的兴起,大量文本数据的出现推动了统计学习方法在自然语言的应用

3.神经网络自然语言处理直接通过深度学习建模,用神经网络进行端对端的训练。

自然语⾔处理通俗来说就是把人类的语言符号转化为机器能够进行计算的数字,因为普通的文本语言机器是看不懂的,必须通过转化来表征对应文本。在这套系统中,词是表义的基本单元,把词映射为实数域向量的技术也叫词嵌⼊(word embedding),近年来,词嵌⼊已逐渐成为⾃然语⾔处理的基础知识。

One-hot Encoding

One-hot Encoding 简称独热向量编码,也是特征工程中最常用的方法,如字典词表

"去","买","水果店","手机店", "苹果" ,"电子类","水果类" , 词表大小是7,那么读热向量编码的维度是7

cpp 复制代码
"去" :     [1,0,0,0,0,0,0]
"买" :     [0,1,0,0,0,0,0]
"水果店" : [0,0,1,0,0,0,0]
"手机店" : [0,0,0,1,0,0,0]
"苹果" :   [0,0,0,0,1,0,0]
"电子类" : [0,0,0,0,0,1,0]
"水果类" : [0,0,0,0,0,0,1]

独热编码仅仅将词转换成向量,类别对应的索引位置设为 1,其余位置设为 0。

词嵌⼊

"去手机店买苹果" 这里的"苹果 "指的是 **电子类,**使用独热编码无法建立 "手机店"、"苹果"、"电子类"之间的关系 因为对应的索引位置设为 1,其余位置设为 0,如果语料增加维度也要增加。针对以上问题 1.向量维度数据取一个范围的数据(0.0 ~ 1.0),

2.维度设置成不大不小数值如256维度

  1. 建立模型 如 "手机店" * "苹果" = "电子类", "水果店" * "苹果" = "水果类" ,用向量可以建立理解单词之间的关系。

4 单词维度数值通过训练得到。

这样的编码方式叫词嵌⼊

Embedding 例子

使用LibTorch中Embedding做个**词嵌⼊**的训练例子,字典词表大小: 10个单词,单词维度: 4,

用torch::nn::Embedding建立模型,定义目标数据, 经过训练,得到 词嵌⼊向量编码,代码

cpp 复制代码
void EmbeddingMain()
{
  
    const int64_t num_embeddings = 10;     /// 字典词表大小 10个单词   
    const int64_t embedding_dim = 4;       /// 单词维度 4 
    const int64_t batch_size = 2;          
    const int64_t seq_len = 3;             
    const int64_t epochs = 50;             
    const float lr = 0.1;                  

    auto model = torch::nn::Embedding(torch::nn::EmbeddingOptions(num_embeddings, embedding_dim));
 
    torch::nn::MSELoss loss_fn;
    
    torch::optim::SGD optimizer(model->parameters(), torch::optim::SGDOptions(lr));
    /// 1, 3, 5, 2, 4, 6   字典词表 索引位置   
    torch::Tensor input_indices = torch::tensor({{1, 3, 5},{2, 4, 6}}, torch::kLong);
    
    torch::Tensor target_embeddings = torch::tensor({
        {{0.1, 0.2, 0.3, 0.4}, {0.3, 0.4, 0.5, 0.6}, {0.5, 0.6, 0.7, 0.8}}, ///  目标 词向量
        {{0.2, 0.3, 0.4, 0.5}, {0.4, 0.5, 0.6, 0.7}, {0.6, 0.7, 0.8, 0.9}}  ///  目标 词向量
        }, torch::kFloat);

    
    std::cout << "=== 训练前嵌入矩阵 ===" << std::endl;
    auto init_embedding = model->weight.data();
    std::cout << init_embedding << std::endl;


    std::cout << "\n=== 开始训练 ===" << std::endl;
    model->train();  

    for (int64_t epoch = 0; epoch < epochs; ++epoch) 
    {
        
        optimizer.zero_grad();
        torch::Tensor output = model->forward(input_indices);
        torch::Tensor loss = loss_fn(output, target_embeddings);
        loss.backward();
        optimizer.step();

        if ((epoch + 1) % 5 == 0)
        {
            std::cout << "Epoch: " << std::setw(3) << (epoch + 1)
                << " | Loss: " << std::fixed << std::setprecision(6) << loss.item<float>() << std::endl;
        }
    }

   
    std::cout << "\n=== 训练后嵌入矩阵 ===" << std::endl;
    auto final_embedding = model->weight.data();
    std::cout << final_embedding << std::endl;

    std::cout << "\n=== 训练后推理示例 ===" << std::endl;
    torch::Tensor test_input = torch::tensor({ 1, 3 }, torch::kLong);  
    torch::Tensor test_output = model->forward(test_input);
    std::cout << "测试输入索引: [1, 3]" << std::endl;
    std::cout << "训练后嵌入输出:\n" << test_output << std::endl;

    
}

感谢大家的支持,如要问题欢迎提问指正。

相关推荐
易知微EasyV数据可视化8 小时前
当AI开始理解物理与场景,数字孪生如何回归其价值本身?
人工智能·经验分享·数字孪生
大数据在线12 小时前
布局Agentic AI,亚马逊云科技组合拳再升级
人工智能·openai·亚马逊云科技·智能体·agentic ai
皮皮学姐分享-ppx16 小时前
政府绿色采购数据库(2015-2024.3)
大数据·网络·数据库·人工智能·制造
GIS数据转换器16 小时前
基于3D GIS的监控视频精准标定平台
人工智能·物联网·3d·音视频·无人机·知识图谱
专注VB编程开发20年16 小时前
AI 生成C# WinForm 窗体 = 目前就是垃圾
开发语言·人工智能·c#
深小乐16 小时前
Claude Fable5 尝鲜,效果挺不错
人工智能
Nayxxu16 小时前
Gemini + RAG 企业知识库教程:从文档切片到答案生成
运维·人工智能
冬奇Lab17 小时前
真正的 AI-Native Workflow 是什么?——四个判断测试
人工智能·agent
冬奇Lab17 小时前
每日一个开源项目(第128篇):Agent Skills - 给 AI 编程 Agent 装上工程纪律
人工智能·开源·资讯
Deepoch17 小时前
Deepoc VLA开发板:采摘机器人的环境鲁棒作业与不确定性应对
人工智能·机器人·采摘机器人·deepoc