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

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

1 语言模型

N-Gram模型

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

from collections import defaultdictsentences = ['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 optimsentences = ["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 outputmodel = 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)  # 求lossif (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.mzph.cn/bicheng/47187.shtml

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

相关文章

华为1000人校园实验记录

在这里插入代码片1000人校园区网设计 1、配置Eth-trunk实现链路冗余 vlan 900 管理WLAN #接入SW8 操作&#xff1a;sys undo in en sysname JR-SW8 int Eth-Trunk 1 mode lacp-static trunkport g0/0/1 0/0/2 port link-type trunk port trunk allow-pass vlan 200 900 qu vla…

Linux C++ 056-设计模式之迭代器模式

Linux C 056-设计模式之迭代器模式 本节关键字&#xff1a;Linux、C、设计模式、迭代器模式 相关库函数&#xff1a; 概念 迭代器模式&#xff08;Iterator Pattern&#xff09;是一种常用的设计模式。迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素&#xff0c;而…

模拟器小程序/APP抓包(Reqable+MUMU模拟器)

一、使用adb连接上MUMU模拟器 打开多开器点击ADB图标 连接模拟器端口&#xff1a; adb connect 127.0.0.1:16384列出已连接的设备&#xff1a; adb devices正常会显示MuMu的设备已连接 二、下载Reqable 1.下载链接&#xff1a;客户端下载 | Reqable 2.文档链接&#xff1a;…

Bigdata-Docker构建大数据学习开发环境

Bigdata-Docker构建大数据学习开发环境 介绍 1、镜像环境 系统&#xff1a;centos 7Java &#xff1a;java7Zookeeper: 3.4.6Hadoop: 2.7.1mysql: 5.6.29Hive: 1.2.1Spark: 1.6.2Hbase: 1.1.2 2、镜像介绍 tonywell/centos-java&#xff1a;openssh、java7&#xff0c;基础…

示例:在WPF ListBox中,ScrollViewer.CanContentScroll=“False“破坏虚拟化如何解决

一、目的&#xff1a;分享一个解决ListBox设置了ScrollViewer.CanContentScroll"False"破坏虚拟坏的解决方法 ScrollViewer.CanContentScroll 是 WPF 中 ScrollViewer 控件的一个属性&#xff0c;它决定了滚动内容时是按逻辑单位&#xff08;如项&#xff09;还是按物…

redis基本类型和订阅

redis-cli -h <host> -p <port> -a <password> 其中&#xff0c;< host>是Redis服务器的主机名或IP地址&#xff0c;< port>是Redis服务器的端口号&#xff0c;< password>是Redis服务器的密码&#xff08;如果有的话&#xff09;。 set …

在项目中,如何使用springboot+vue+springsecurity+redis缓存+Axios+MySQL数据库+mybatis

要在项目中使用springbootvuespringsecurityredis缓存AxiosMySQL数据库mybatis&#xff0c;可以按照以下步骤进行操作&#xff1a; 创建一个Spring Boot项目&#xff0c;并添加所需的依赖。在pom.xml文件中添加Spring Boot、Spring Security、Redis、MySQL和MyBatis的依赖项。 …

JAVA学习-练习试用Java实现“只出现一次的数字 II”

问题&#xff1a; 给定一个整数数组 nums &#xff0c;除某个元素仅出现 一次 外&#xff0c;其余每个元素都恰出现 三次 。请找出并返回那个只出现了一次的元素。 示例 1&#xff1a; 输入&#xff1a;nums [2,2,3,2] 输出&#xff1a;3 示例 2&#xff1a; 输入&#xf…

从零手写实现 nginx-30-upstream+proxy_pass 反向代理指令介绍

前言 大家好&#xff0c;我是老马。很高兴遇到你。 我们为 java 开发者实现了 java 版本的 nginx https://github.com/houbb/nginx4j 如果你想知道 servlet 如何处理的&#xff0c;可以参考我的另一个项目&#xff1a; 手写从零实现简易版 tomcat minicat 手写 nginx 系列 …

LLM基础模型系列:Prompt-Tuning

------->更多内容&#xff0c;请移步“鲁班秘笈”&#xff01;&#xff01;<------ 大型预训练语言模型的规模不断扩大&#xff0c;在许多自然语言处理 &#xff08;NLP&#xff09; 基准测试中取得了最先进的结果。自GPT和BERT开发以来&#xff0c;标准做法一直是在下游…

SCP 使用教程

SCP&#xff08;Secure Copy Protocol&#xff09;是一种通过加密的方式在本地主机和远程主机之间安全地传输文件的协议。它是基于SSH协议的扩展&#xff0c;允许用户在不同主机之间进行文件复制和传输&#xff0c;是Linux和Unix系统中常用的工具之一。本教程将详细介绍SCP的基…

migrate table com.finebi.persist.impl.entity.PackageSubItemEntity failed

记录一个报错解决过程&#xff0c;finebi在连接外部mysql时&#xff0c;要把finebi里的表导入到mysql&#xff0c;但是如果mysql库不是utf8就会报错如下migrate table com.finebi.persist.impl.entity.PackageSubItemEntity failed 解决方法&#xff1a;用下面语句创建的库是…

数字化教育资源如何适应人工智能时代

01 教育资源应动态适应一线教学需求 用好数字化教育资源是一项系统工程&#xff0c;涉及教育教学的各个方面&#xff0c;包括教师和学生的教育观念与技术观念、信息技术素养&#xff0c;以及课程教学改革、教师培训等。还涉及数字化教育资源提供方的服务&#xff0c;如技术支持…

【STM32嵌入式系统设计与开发---拓展】——1_9_1上拉输入和下拉输入

在使用GPIO引脚时&#xff0c;上拉输入和下拉输入的选择取决于外部电路的特性和应用需求。以下是它们各自的应用场景&#xff1a; 1、上拉输入&#xff08;Pull-up Input&#xff09; 用途: 当默认状态需要为高电平时。 避免引脚悬空&#xff08;floating&#xff09;导致的…

计算机网络——网络层(路由选择协议、路由器工作原理、IP多播、虚拟专用网和网络地址转换)

目录 路由选择协议 因特网的路由选择协议特点 路由信息协议RIP RIP衡量目的网络距离 RIP选择路由器的方式 RIP具有以下三个重要特点 RIP的基本工作流程 RIP的距离向量算法 ​编辑 ​编辑 RIP存在的问题——“坏消息传播得慢” RIP的封装 开放最短路径优先协议OSPF…

在CSS中,使用Flexbox布局时,可以通过几个属性来控制容器内的项目之间的间距

display弹性布局&#xff0c;flex:1是占据剩下的空间 关于displa:flex /* 水平和垂直居中&#xff0c;水平和垂直方向上的间距均匀分布 / .container { display: flex; justify-content: space-between; / 左右对齐 / align-items: center; / 上下间距 */ flex-direction: ro…

YOLOv7 更换Neck之 BiFPN

简介 YOLOv7 是 Ultralytics 公司于 2022 年 4 月发布的最新一代目标检测模型&#xff0c;在 COCO 数据集上取得了56.2 mAP 的惊人成绩&#xff0c;超越了所有已知的目标检测模型。YOLOv7 的核心架构与之前的版本基本一致&#xff0c;但对一些关键模块进行了改进&#xff0c;其…

AcWing 668. 游戏时间2

读取四个整数 A,B,C,D&#x1d434;,&#x1d435;,&#x1d436;,&#x1d437;&#xff0c;用来表示游戏的开始时间和结束时间。 其中 A&#x1d434; 和 B&#x1d435; 为开始时刻的小时和分钟数&#xff0c;C&#x1d436; 和 D&#x1d437; 为结束时刻的小时和分钟数。…

昇思25天学习打卡营第23天|基于MindSpore的Pix2Pix实现图像转换

Pix2Pix实现图像转换 Pix2Pix概述 Pix2Pix是基于条件生成对抗网络&#xff08;cGAN, Condition Generative Adversarial Networks &#xff09;实现的一种深度学习图像转换模型&#xff0c;该模型是由Phillip Isola等作者在2017年CVPR上提出的&#xff0c;可以实现语义/标签到…

Spring Boot app: Failed to determine a suitable driver class

目录 问题描述解决方案 问题描述 我尝试连接springboot&#xff1b;当我运行时&#xff0c;出现错误“Failed to configure a DataSource: ‘url’ attribute is not specified and no embedded datasource could be configured."” application.yml 应用程序.yml dat…