Large Language Model系列之一:语言模型与表征学习(Language Models and Representation Learning)

news2024/11/15 8:55:19

语言模型与表征学习(Language Models and Representation Learning)

1 语言模型

N-Gram模型

在这里插入图片描述
在这里插入图片描述

from collections import defaultdict


sentences = ['The swift fox jumps over the lazy dog.',
    'The swift river flows under the ancient bridge.',
    'The swift breeze cools the warm summer evening.']

preprocesses_sentences = [["<s>"] + sentence.lower().replace(".","").split() + ["</s>"] for sentence in sentences]
print(preprocesses_sentences)

bigram_model = defaultdict(lambda: defaultdict(lambda: 0))

for sentence in preprocesses_sentences:
    for w1, w2 in zip(sentence[:-1], sentence[1:]):
        bigram_model[w1][w2] += 1
print(bigram_model)

for w1 in bigram_model:
    total_count = float(sum(bigram_model[w1].values()))
    for w2 in bigram_model[w1]:
        bigram_model[w1][w2] /= total_count
print(bigram_model)

bigram_model_probs = {w1: dict(w2) for w1, w2 in bigram_model.items()}
print(bigram_model_probs)

参考资料:
1 了解N-Gram模型
2 语言模型

神经网络语言模型(NNLM)

在这里插入图片描述

import torch
import torch.nn as nn
import torch.optim as optim

sentences = ["i like dog", "i love coffee", "i hate milk"]

word_list = " ".join(sentences).split()  # 制作词汇表
print(word_list)
word_list = list(set(word_list))  # 去重
print("after set: ", word_list)
word_dict = {w: i for i, w in enumerate(word_list)}  # 每个单词对应的索引
number_dict = {i: w for i, w in enumerate(word_list)}  # 每个索引对应的单词
n_class = len(word_dict)  # 单词总数

# NNLM Parameter
n_step = 2  # 根据前两个单词预测第3个单词
n_hidden = 2  # h 隐藏层神经元的个数
m = 2  # m 词向量的维度

def make_batch(sentences):
    input_batch = []
    target_batch = []

    for sen in sentences:
        word = sen.split()
        input = [word_dict[n] for n in word[:-1]]
        target = word_dict[word[-1]]

        input_batch.append(input)
        target_batch.append(target)

    return torch.LongTensor(input_batch), torch.LongTensor(target_batch)


class NNLM(nn.Module):
    def __init__(self):
        super(NNLM, self).__init__()
        self.C = nn.Embedding(n_class, m)
        self.H = nn.Parameter(torch.randn(n_step * m, n_hidden).type(torch.FloatTensor))
        self.W = nn.Parameter(torch.randn(n_step * m, n_class).type(torch.FloatTensor))
        self.d = nn.Parameter(torch.randn(n_hidden).type(torch.FloatTensor))
        self.U = nn.Parameter(torch.randn(n_hidden, n_class).type(torch.FloatTensor))
        self.b = nn.Parameter(torch.randn(n_class).type(torch.FloatTensor))

    def forward(self, X):
        X = self.C(X)
        X = X.view(-1, n_step * m)  # [batch_size, n_step * n_class]
        tanh = torch.tanh(self.d + torch.mm(X, self.H))  # [batch_size, n_hidden]
        output = self.b + torch.mm(X, self.W) + torch.mm(tanh, self.U)  # [batch_size, n_class]
        return output


model = NNLM()

criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

input_batch, target_batch = make_batch(sentences)


# Training
for epoch in range(5000):

    optimizer.zero_grad()

    output = model(input_batch)

    # output : [batch_size, n_class], target_batch : [batch_size] (LongTensor, not one-hot)
    loss = criterion(output, target_batch)  # 求loss
    if (epoch + 1) % 1000 == 0:
        print('Epoch:', '%04d' % (epoch + 1), 'cost =', '{:.6f}'.format(loss))

    loss.backward()
    optimizer.step()


# Predict
predict = model(input_batch).data.max(1, keepdim=True)[1]

# Test
print([sen.split()[:2] for sen in sentences], '->', [number_dict[n.item()] for n in predict.squeeze()])

参考资料:
1 【NLP】神经网络语言模型(NNLM)
2 A Neural Probabilistic Language Model_论文阅读及代码复现pytorch版
3 语言模型

2 词表示

Word2vec

Word2vec是一种用于生成词嵌入的算法,它通过分析词在文本中的上下文来捕捉词的语义信息。利用海量的文本序列,根据上下文单词预测目标单词共现的概率,让一个构造的网络向概率最大化优化,得到的参数矩阵就是单词的向量。

Word2vec算法模型

Word2vec算法包含两种主要的模型,每种模型都以不同的方式利用上下文来学习词的向量表示:
连续词袋模型(CBOW):

  • 在CBOW模型中,上下文词被用来预测它们中间的目标词。这种方法将上下文视为一个整体,不考虑词的顺序,类似于一个“词袋”。
  • 给定一个目标词,CBOW模型会考虑其周围的词,并尝试基于这些上下文词来预测目标词。

在这里插入图片描述

Skip-gram模型:

  • 与CBOW相反,Skip-gram模型使用单个词来预测它的上下文。这种模型适合于处理较大的词汇表,并且能够更精确地捕捉词与上下文之间的关系。
  • Skip-gram模型的名称来源于其能力,可以“跳过”目标词并预测其周围的词,即使这些词在句子中的位置相隔较远。
    两种模型都通过优化神经网络的权重来学习词的向量表示,使得词向量能够捕捉到词义和上下文的复杂关系。通过这种方式,word2vec能够为每个词生成一个连续的向量空间中的点,这些点在向量空间中的相对位置反映了词之间的语义相似性。

在这里插入图片描述

Word2vec加快训练速度

Word2vec的实现中,有两种主要的技术用于提高训练效率和处理大数据集:层次Softmax(Hierarchical Softmax)和负采样(Negative Sampling)。

Hierarchical Softmax(层次Softmax)

层次Softmax用于加速Softmax层的计算过程,核心思想是将条件概率估计可以转换为 l o g 2 ∣ V ∣ log_{2}|V| log2V 个两类分类问题。在传统的Softmax中,计算所有词汇的概率分布需要对词汇表中的每个词进行操作,这在大规模词汇表中非常耗时。

  • 构建二叉树:层次Softmax首先基于词汇表构建一个二叉树,每个节点代表一个词汇,叶子节点是词汇表中的词,内部节点是虚拟的词。
  • 从根到叶的路径:对于每个目标词,都有一个从根节点到该词所在叶子节点的路径。
  • 路径上的节点进行二分类:在这条路径上,模型只需要对每个内部节点做出是向左子树还是向右子树的二分类决策,而不是在整个词汇表上进行多分类。
  • 减少计算量:这种方法显著减少了计算量,因为每次只对词汇表中的一部分进行操作,而不是全部词汇。
Negative Sampling(负采样)

负采样是另一种提高训练效率的技术,,核心思想是将条件概率转化为多个二分类问题,特别是在处理大规模数据集时。

  • 选择正样本:在每次迭代中,除了目标词(正样本)之外,还会随机选择几个“噪声词”作为负样本。
  • 训练二分类器:模型被训练为将正样本与负样本区分开来。这通过多次二分类问题来近似Softmax的多分类问题。
  • 减少计算复杂度:与层次Softmax不同,负采样不需要构建树结构,但它通过减少每次迭代中考虑的词的数量来降低计算复杂度。
  • 参数调整:负采样中的关键是负样本的数量,这需要根据具体任务和数据集进行调整。

层次Softmax和负采样都是word2vec中用于提高训练效率的技术。层次Softmax通过构建词汇的二叉树结构来减少Softmax层的计算量,而负采样通过引入负样本来近似Softmax的输出分布,两者都能在保持词向量质量的同时加快模型的训练速度。在实际应用中,根据数据集的大小和训练资源,可以选择其中一种或两种技术的组合来优化word2vec的训练过程。

word2vec的训练过程:以CBOW为例

假设我们有句子 “I learn NLP everyday”,并且我们用 “I”, “learn”, “everyday” 作为上下文来预测 “NLP”。
在这里插入图片描述

  • One-hot编码:将上下文词 “I”, “learn”, “everyday” 转换为one-hot向量。
    在这里插入图片描述

  • 嵌入矩阵乘法:将one-hot向量与嵌入矩阵相乘,得到上下文词的向量化表示。
    在这里插入图片描述

  • 求平均:将这些向量相加后求平均,形成CBOW模型的隐藏层表示。
    在这里插入图片描述

  • 预测计算:将隐藏层表示与另一个嵌入矩阵相乘,得到预测词的原始分数。
    在这里插入图片描述

  • Softmax输出:通过Softmax函数将原始分数转换为概率,选择概率最高的词作为预测结果。
    在这里插入图片描述

  • 损失计算与优化:计算预测结果与实际目标词之间的损失,并使用梯度下降等优化算法来调整权重矩阵。

参考资料:
1 【NLP】图解词嵌入和Word2vec
2 深入理解word2vec
3 详解Word2Vec,从理论到实践让你从底层彻底了解Word2Vec!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1931925.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言 ——— 编写代码,判断 整型数组 是否 有序

目录 题目要求 代码实现 题目要求 判断 整型数组 是否有序 如果 整型数组 有序输出 sorted&#xff1b;否则输出 unsorted 代码实现 #include<stdio.h> int main() {int arr[10] { 0 };int sz sizeof(arr) / sizeof(arr[0]);//输入for (int i 0; i < sz; i){s…

大数据基础:Doris重点架构原理

文章目录 Doris重点架构原理 一、Apache Doris介绍 二、Apache Doris使用场景 三、Apache Doris架构原理 四、Apache Doris 特点 Doris重点架构原理 一、Apache Doris介绍 基于 MPP 架构的高性能、实时的分析型数据库&#xff0c;以极速易用的特点被人们所熟知&#xff…

YOLOV5的输出[1,25200,85]如何理解和解析

1、25200代表着检测框的数量&#xff0c;比如我们取出第一个检测框a&#xff0c;也就是[1,1&#xff0c;85]&#xff0c;取出来之后我们解析85&#xff0c;前五个为box的中点坐标、长宽值以及置信&#xff0c;后面80我们取Max&#xff08;80个类别&#xff09;中最大值&#xf…

【解决】多个网卡导致nacos注册的服务ip有误问题

解决办法 在本地idea中启动的时候添加启动配置&#xff1a; 方法一 -Dspring.cloud.inetutils.preferred-networks你自己网卡的ip 方法二 -Dspring.cloud.nacos.discovery.ip你自己网卡的ip

朴素模式匹配算法与KMP算法(非重点)

目录 一. 朴素模式匹配算法1.1 什么是字符串的匹配模式1.2 朴素模式匹配算法1.3 通过数组下标实现朴素模式匹配算法 二. KMP算法2.1 算法分析2.2 用代码实现&#xff08;只会出现在选择题&#xff0c;考察代码的概率不大&#xff09; 三. 手算next数组四. KMP算法的进一步优化4…

【CH32V303RCT6】NB模块在CTwing下的OTA升级[实操过程篇]

一、 本篇内容简介 本篇主要通过日志打印和一些云端的显示&#xff0c;来讲解整个SOTA升级的过程。 二、实验现象 2.1、目标代码 2.2、最终效果 当我们升级成功后&#xff0c;会跳转到APP_B执行程序。 三、设计思路 根据电信云平台的OTA设计特性&#xff0c;本次设计是通过…

【自撰写】【国际象棋入门】第11课 对局实例分析(一)

第11课 对局实例分析&#xff08;一&#xff09; 本次课中&#xff0c;我们来分析一例真实的对局。对局弈于“国象联盟”APP&#xff0c;日期为2024年6月13日星期四&#xff0c;我执黑。开局伊始&#xff0c;白方的布局略占优势&#xff0c;中局阶段黑方一直保持着微弱的领先&…

[AWS]CodeCommit的创建与使用

背景&#xff1a;CodeCommit是AWS自带的代码管理仓库&#xff0c;使用起来很不顺手&#xff0c;不如自建的gitlab仓库。不足之处很多&#xff0c;比如&#xff1a;缺乏可视化工具、用户管理麻烦&#xff0c;仓库管理手段贫瘠。 老板为了简单就使用了CodeCommit进行管理&#xf…

一个用于管理多个 Node.js 版本的安装和切换开源工具

大家好&#xff0c;今天给大家分享一个用于管理多个Node.js版本的工具 NVM&#xff08;Node Version Manager&#xff09;&#xff0c;它允许开发者在同一台机器上安装和使用不同版本的Node.js&#xff0c;解决了版本兼容性问题&#xff0c;为开发者提供了极大的便利。 在开发环…

Mongodb多键索引中索引边界的混合

学习mongodb&#xff0c;体会mongodb的每一个使用细节&#xff0c;欢迎阅读威赞的文章。这是威赞发布的第93篇mongodb技术文章&#xff0c;欢迎浏览本专栏威赞发布的其他文章。如果您认为我的文章对您有帮助或者解决您的问题&#xff0c;欢迎在文章下面点个赞&#xff0c;或者关…

ubuntu搭建harbor私仓

1、环境准备 链接: https://pan.baidu.com/s/1q4XBWPd8WdyEn4l253mpUw 提取码: 7ekx --来自百度网盘超级会员v2的分享 准备一台Ubuntu 机器:192.168.124.165 将上面两个文件考入Ubuntu上面 2、安装harbor 安装Docker Harbor仓库以容器方式运行,需要先安装好docker,参考:…

移动终端的安全卫士

随着移动互联网的快速发展&#xff0c;移动端安全风险频发。设备指纹技术凭借高精度的设备识别能力&#xff0c;能够帮助企业提升移动端安全防护能力&#xff0c;精准区分合法与风险行为&#xff0c;跨行业赋能风控&#xff0c;为金融、电商、游戏等多领域提供强大的业务安全保…

不想填邀请码?Xinstall来帮你,一键安装无忧愁

在这个快节奏的时代&#xff0c;每一个点击都承载着用户的期待与耐心。然而&#xff0c;在下载App的过程中&#xff0c;繁琐的邀请码填写往往成为了用户体验的一大障碍。你是否也曾经因为不愿填写邀请码而放弃了一款心仪的App&#xff1f;今天&#xff0c;就让我们一起走进Xins…

STM32智能交通监测系统教程

目录 引言环境准备智能交通监测系统基础代码实现&#xff1a;实现智能交通监测系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;交通监测与管理问题解决方案与优化收尾与总结 1. 引言 智能交通监测系统通…

1千多看图猜成语游戏ACCESS\EXCEL数据库

今天闲来无事想写个代码自己搞定&#xff0c;我不写代码已经很久了&#xff0c;主要是年纪不小了对新技术的学习比较吃力&#xff0c;兴趣也被生活打磨的体无完肤。今天又捡起VB&#xff08;暴露了年纪&#xff09;搞了一下。 当然&#xff0c;很多事情都是这样&#xff0c;自己…

【入门级】docker

开头处生动的描述一下”码头工人”吧&#xff1a;小鲸鱼&#xff08;登记处Registry&#xff1a;比如docker hub官方&#xff09;背着好多集装箱&#xff08;仓库repository&#xff1a;存放各种各样的镜像&#xff0c;一般存放的是一类镜像&#xff0c;这一类镜像中通过tag 版…

数据安全的护航者:数据脱敏与敏感词过滤详解

数据安全重要性 发散问题&#xff0c;大家最近有没有因隐私或者敏感数据泄露而产生的问题以及烦恼&#xff1f; 生活中&#xff0c;手机、身份证、社保账号等泄露引发的困扰 工作中.... 之前测试环境发送邮件给客户的用户等 1、什么是数据脱敏 定义&#xff1a;数据脱敏是…

【算法笔记自学】第 9 章 提高篇(3)——数据结构专题(2)

9.1树与二叉树 #include <cstdio>int main() {int n, m;scanf("%d%d", &n, &m);printf(n m 1 ? "Yes" : "No");return 0; } 9.2二叉树的遍历 #include <cstdio> #include <vector> using namespace std;const int…

useState函数

seState是一个react Hook(函数)&#xff0c;它允许我们像组件添加一个状态变量&#xff0c;从而控制影响组件的渲染结果 数据驱动试图 本质&#xff1a;和普通JS变量不同的是&#xff0c;状态变量一旦发生变化组件的视图UI也会随着变化(数据驱动试图) 使用 修改状态 注意&am…

tracert及Test-netconnection使用

tracert命令 tracert <参数> <目标 IP 或主机名>-d 不将地址解析成主机名。 -h maximum_hops 搜索目标的最大跃点数。 -j host-list 与主机列表一起的松散源路由(仅适用于 IPv4)。 -w timeout 等待每个回复的超时时间(以毫秒为单位)。 -R 跟踪往返行程路径(仅适用…