欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 社会 > 语言模型(序列模型)

语言模型(序列模型)

2024/12/22 2:29:23 来源:https://blog.csdn.net/HJS1453100406/article/details/144381237  浏览:    关键词:语言模型(序列模型)

终于快要毕业了,乘着还在还在研究室,把最后一章sequence模型也学完吧。

Sequence Model

  • 一:基础知识
    • 1:符号的定义
    • 2:词典(Vocabulary) 与编码(Encoding)
  • 二:RNN(Recurrent Neural Networks) 循环神经网络
    • 1:模型架构
    • 2:公式
    • 3:不同类型的RNN模型架构
  • 三:Language Model(LM) 语言模型
    • 1:模型架构
    • 2:概率公式
    • 如何进行文本生成?
    • 如何像ChatGPT一样对话呢?
    • ChatGPT也是依赖“问题-答案对”的样本训练吗?
  • 四:Sampling Novel Sequences 采样新序列
  • 五:Vanishing Gradient (梯度消失) & (Exploding Gradient 梯度爆炸)
  • 六:Gated Recurrent Unit(GRU) : 门控循环单元. 一种改进梯度消失的方法。
    • 1:基本模型架构
    • 2:基本GRU公式
    • 3:Full GRU公式
  • 七:Long Short-Term Memory(LSTM) : 长短期记忆
    • 1:模型架构
    • 2:公式

一:基础知识

1:符号的定义

X X X: 表示是一组输入的序列,也就是一段话,类似:

  • X = X= X= “Cats average 15 hours of sleep a day.”
  • 如果任务需要处理变长序列,则会用 <EOS> 标记序列结束
    X = X= X= “Cats average 15 hours of sleep a day. <EOS>

Y Y Y: 标签序列

T : T: T 时间序列的总长度,也就是总时间步数

  • 一般用到的是很多个 t t t 来表示某一个时刻。 x < 1 > x^{<1>} x<1> x < t > x^{<t>} x<t>
  • 在词类的任务中 (word-level classification) x < 1 > = x^{<1>}= x<1>=“Cast”、 x < 2 > = x^{<2>}= x<2>=“average”…
  • 在字母的任务中(character-level processing) x < 1 > = x^{<1>}= x<1>=“C”、 x < 2 > = x^{<2>}= x<2>=“a”…

除此之外,仍然用 i i i 表示每一个单独的样本

x ( i ) < t > : x^{(i)<t>}: x(i)<t>: i i i 个样本的第 t t t 个词.

T x ( i ) T_x^{(i)} Tx(i): 第 i i i 个序列的长度.

2:词典(Vocabulary) 与编码(Encoding)

词典是一个映射关系,将数据中的每个唯一单词或字符分配一个唯一的索引。
One-hot 编码将每个类别或字符表示为一个长度为词典长度的二进制向量。

如果在输入的序列 X X X中遇到一个词 x < 1 > x^{<1>} x<1>并且该词存在于一个词典 V={‘a’,‘ab’,‘abc’…‘zulu’}中,

使用One-hot对 ‘a’ 进行编码,则是[1,0,0,…,0]. 对 ‘zulu’ 进行编码则是[0,0,0,…,1].

如果一个单词、字符或子词不在词典中,通常会将其标记为 unknown word(未知词,简称 UNK)

并使用特殊符号 <UNK> 来表示。

二:RNN(Recurrent Neural Networks) 循环神经网络

1:模型架构

在这里插入图片描述
其中,权重矩阵 W a x W_{ax} Wax W a a W_{aa} Waa W y a W_{ya} Wya 的命名顺序是 输出-输入

为什么?

因为矩阵乘法的维度规则就是 矩阵A(输出维度\隐藏维度,输入维度) × 矩阵B(输出维度\隐藏维度,输入维度)

2:公式

a < t > = g ( w a a a < t − 1 > + w a x x < t > + b a ) a^{<t>}=g(w_{aa}a^{<t-1>}+w_{ax}x^{<t>}+ba) a<t>=g(waaa<t1>+waxx<t>+ba)
其中 w a a w_{aa} waa w a x w_{ax} wax可以堆积为 [ w a a : w a x ] = w a [w_{aa}:w_{ax}]=w_{a} [waa:wax]=wa

a < t > = g ( w a [ a < t − 1 > , x < t > ] + b a ) a^{<t>}=g(w_{a}[a^{<t-1>}, x^{<t>}]+ba) a<t>=g(wa[a<t1>,x<t>]+ba)
y ^ < t > = g ( w y a a < t > + b y ) \hat y^{<t>}=g(w_{ya}a^{<t>}+by) y^<t>=g(wyaa<t>+by)

损失函数
l < t > ( y ^ < t > , y < t > ) = − y < t > log ⁡ y ^ < t > − ( 1 − y < t > ) log ⁡ ( 1 − y ^ < t > ) l^{<t>}(\hat y^{<t>}, y^{<t>}) = - y^{<t>}\log \hat y^{<t>}-(1-y^{<t>})\log(1 - \hat y^{<t>}) l<t>(y^<t>,y<t>)=y<t>logy^<t>(1y<t>)log(1y^<t>)

L = ∑ t = 1 T = l < t > ( y ^ < t > , y < t > ) L = \sum_{t=1}^{T}=l^{<t>}(\hat y^{<t>}, y^{<t>}) L=t=1T=l<t>(y^<t>,y<t>)

3:不同类型的RNN模型架构

在这里插入图片描述

三:Language Model(LM) 语言模型

LM的核心目标就是根据已有的上下文(文本序列)来预测接下来的词语或句子。

  • 输入:一个文本序列(或上下文)。
  • 学习:隐藏状态 a t a^t at或者 h t h^t ht
  • 输出:预测下一个词的概率分布,或评估整个序列的概率。
  • 计算机损失:其中传统的标签 y y y就是序列训练样本中的单词。

1:模型架构

通过上一个词预测下一个词出现的概率
在这里插入图片描述

2:概率公式

P ( y ⟨ 1 ⟩ , y ⟨ 2 ⟩ , y ⟨ 3 ⟩ ) = P ( y ⟨ 1 ⟩ ) ⋅ P ( y ⟨ 2 ⟩ ∣ y ⟨ 1 ⟩ ) ⋅ P ( y ⟨ 3 ⟩ ∣ y ⟨ 1 ⟩ , y ⟨ 2 ⟩ ) P(y^{\langle 1 \rangle}, y^{\langle 2 \rangle}, y^{\langle 3 \rangle}) = P(y^{\langle 1 \rangle}) \cdot P(y^{\langle 2 \rangle} \mid y^{\langle 1 \rangle}) \cdot P(y^{\langle 3 \rangle} \mid y^{\langle 1 \rangle}, y^{\langle 2 \rangle}) P(y1,y2,y3)=P(y1)P(y2y1)P(y3y1,y2)
P ( y ⟨ 1 ⟩ , y ⟨ 2 ⟩ , … , y ⟨ T ⟩ ) = ∏ t = 1 T P ( y ⟨ t ⟩ ∣ y ⟨ 1 ⟩ , y ⟨ 2 ⟩ , … , y ⟨ t − 1 ⟩ ) P(y^{\langle 1 \rangle}, y^{\langle 2 \rangle}, \dots, y^{\langle T \rangle}) = \prod_{t=1}^{T} P(y^{\langle t \rangle} \mid y^{\langle 1 \rangle}, y^{\langle 2 \rangle}, \dots, y^{\langle t-1 \rangle}) P(y1,y2,,yT)=t=1TP(yty1,y2,,yt1)

LM 的训练目标是通过大量的序列(例如句子)数据,学习这些序列的概率分布规律,从而捕捉语言中的结构和模式。

  • (1) 文本生成
  • (2) 机器翻译
  • (3) 语音识别
  • (4) 拼写纠正

如何进行文本生成?

文本生成的本质是让计算机学会“接着写”。具体来说:

  • 你给它一个“开头”或“提示”。
  • 它根据这个提示,想象后面应该接什么,像人类完成句子一样。
  • 生成的内容要尽量看起来像“人写的”,语法正确、逻辑连贯。

模型如何完成?

  • 它会看你给的开头(上下文)。
  • 然后基于它学到的“写作经验”(训练数据),去推测下一个可能的内容并且输出。
  • 它不会随便乱写,而是会挑选最符合上下文的词语或句子。
  • 它不是真的理解,而是根据学习到的经验,找到可能性最高的下一个词,也就是去“猜”

如何像ChatGPT一样对话呢?

  • 回答也是一种“接着写”,只是“接着写”这个过程被赋予了更复杂的规则和目标,从简单的续写变成了更有针对性的生成。
  • 训练对话模型通常会使用“问题-答案对”作为训练样本 回答问题时,模型依然是在接着写,只不过上下文(提示)包含了一个明确的问题
  • “问题-答案对”模式,生成最可能符合这个上下文的内容。

在这里插入图片描述

ChatGPT也是依赖“问题-答案对”的样本训练吗?

并不完全是,ChatGPT 的训练过程分为两部分:预训练(Pre-training)和微调(Fine-tuning)

预训练:使用了大量的通用文本数据学习内容的分布,包括互联网文章、书籍、百科、代码片段等。这些数据并不是严格的“问题-答案对”,而是通用文本序列。

微调阶段:使用包含专门的“问题-答案对”,尤其是与对话相关的数据。

四:Sampling Novel Sequences 采样新序列

这个步骤的的主要目的是了解模型学到了什么,也就是希望训练好的模型输出一个句子的方法。

在这里插入图片描述

五:Vanishing Gradient (梯度消失) & (Exploding Gradient 梯度爆炸)

  1. 梯度消失(Vanishing Gradient)
    梯度消失指的是在反向传播过程中,模型的梯度在层层传递时逐渐变小,最终接近于零。这会导致深层网络的前面几层权重几乎不更新,使模型难以有效学习深层特征。

  2. 梯度爆炸(Exploding Gradient)
    梯度爆炸指的是在反向传播过程中,梯度在层层传递时不断增大,导致梯度值非常大,从而导致模型参数更新过大,甚至数值溢出出现NaN,模型无法正常训练。

解决方法:

梯度消失

  • 改进激活函数:使用 ReLU、Leaky ReLU 或 Swish 等不会饱和的激活函数。
  • 归一化技术:如 BatchNormalization,可以在每层网络中规范化激活值,防止数值过小。
  • 权重初始化:使用合适的初始化方法(如 Xavier 或 He初始化),可以让激活值保持稳定范围。
  • 残差网络(ResNet):引入残差连接,允许梯度直接跳过多个网络层。

梯度爆炸

  • 梯度裁剪(Gradient Clipping):对梯度的大小设置上限,防止其值过大。
  • 权重正则化:通过 L2 正则化限制权重值的大小。
  • 权重初始化:合理初始化权重,避免初始值太大。

六:Gated Recurrent Unit(GRU) : 门控循环单元. 一种改进梯度消失的方法。

1:基本模型架构

普通的RNN单元
在这里插入图片描述

GRU的单元
在这里插入图片描述

相较于普通的RNN单元,GRU引入了一个新的组件,更新门 Γ u Γ_u Γu.

这是一个通过学习而动态调整权重的组件,用于判断当前输入新信息对整体序列状态的重要性。

2:基本GRU公式

计算当前新输入 x < t > x^{<t>} x<t>与记录的历史状态的 c < t − 1 > c^{<t-1>} c<t1>的隐藏状态:预备
c ~ < t > = tanh ⁡ ( W c [ c < t − 1 > , x < t > ] + b c ) \tilde c^{<t>}= \tanh (Wc[c^{<t-1>}, x^{<t>}]+bc) c~<t>=tanh(Wc[c<t1>,x<t>]+bc)

更新门:计算当前原始新输入对整体序列状态的重要性。
决定新输入 x < t > x^{<t>} x<t>与记录的历史状态的 c < t − 1 > c^{<t-1>} c<t1>怎么融合

Γ u = σ ( W u [ c < t − 1 > , x < t > ] + b u ) Γ_u= σ(Wu[c^{<t-1>}, x^{<t>}]+bu) Γu=σ(Wu[c<t1>,x<t>]+bu)

更新隐藏状态:将当前新值的影响设为 Γ u Γ_u Γu倍,旧状态的影响设为 1 − Γ u 1-Γ_u 1Γu倍,维度相同,逐元素相乘。
Γ u Γ_u Γu为0时,不更新,保留旧的状态。
c < t > = Γ u ∗ c ~ < t > + ( 1 − Γ u ) ∗ c < t − 1 > c^{<t>}=Γ_u* \tilde c^{<t>}+ (1-Γ_u)*c^{<t-1>} c<t>=Γuc~<t>+(1Γu)c<t1>

3:Full GRU公式

Γ u Γ_u Γu的作用是控制当前输入的新信息与历史状态 的融合比例。换句话说,它决定 “当前输入的重要性有多大”。

然而,在某些场景中,历史信息可能有一部分是无关紧要的,或者对当前任务是“干扰信息”。单靠 Γ u Γ_u Γu无法筛选出历史状态的哪些部分是重要的、哪些应该被忽略。

所以,我们需要一个控制历史信息的门:重置门 Γ r Γ_r Γr

重置门 Γ r Γ_r Γr 的主要作用是允许模型选择性地“忘记”部分历史状态,以便更好地捕获当前输入的重要特征。
Γ r = σ ( W r [ c < t − 1 > , x < t > ] + b r ) Γ_r= σ(Wr[c^{<t-1>}, x^{<t>}]+br) Γr=σ(Wr[c<t1>,x<t>]+br)

候选门:增加了重置门的候选值计算:
c ~ < t > = tanh ⁡ ( W c [ Γ r ∗ c < t − 1 > , x < t > ] + b c ) \tilde c^{<t>}= \tanh (Wc[Γ_r * c^{<t-1>}, x^{<t>}]+bc) c~<t>=tanh(Wc[Γrc<t1>,x<t>]+bc)

更新门:计算当前原始新输入对整体序列状态的重要性。
决定新输入 x < t > x^{<t>} x<t>与记录的历史状态的 c < t − 1 > c^{<t-1>} c<t1>怎么融合

Γ u = σ ( W u [ c < t − 1 > , x < t > ] + b u ) Γ_u= σ(Wu[c^{<t-1>}, x^{<t>}]+bu) Γu=σ(Wu[c<t1>,x<t>]+bu)

更新:

c < t > = Γ u ∗ c ~ < t > + ( 1 − Γ u ) ∗ c < t − 1 > c^{<t>}=Γ_u* \tilde c^{<t>}+ (1-Γ_u)*c^{<t-1>} c<t>=Γuc~<t>+(1Γu)c<t1>

a < t > = c < t > a^{<t>}=c^{<t>} a<t>=c<t>

七:Long Short-Term Memory(LSTM) : 长短期记忆

1:模型架构

在这里插入图片描述

2:公式

注意!!!!!!

  • x < t > x^{<t>} x<t>(当前输入)才是关键的核心信息
  • a < t − 1 > a^{<t-1>} a<t1>(上一时间步的隐藏状态)的作用是为了提供更多的上下文信息,帮助模型更准确地理解和处理当前输入。
  • a < t − 1 > a^{<t-1>} a<t1>以帮助遗忘门、输入门和候选状态的计算更灵活

公式:

候选门:计算当前输入 x < t > x^{<t>} x<t>要保存到长期记忆细胞 c t c^{t} ct中的值作为候选:

c ~ < t > = tanh ⁡ ( W c [ a < t − 1 > , x < t > ] + b c ) \tilde c^{<t>}= \tanh (Wc[a^{<t-1>}, x^{<t>}]+bc) c~<t>=tanh(Wc[a<t1>,x<t>]+bc)

遗忘门 Γ f Γ_f Γf:考虑当前输入 x < t > x^{<t>} x<t>上一时间步的隐藏状态 a < t − 1 > a^{<t-1>} a<t1>, 输出是一个逐元素向量,值范围在[0,1]
将来要使用这个范围在[0,1]的逐元素向量长期记忆细胞 c t − 1 c^{t-1} ct1相乘,来决定记忆是否保留。

Γ f = σ ( W f [ a < t − 1 > , x < t > ] + b f ) Γ_f= σ(W_f[a^{<t-1>}, x^{<t>}]+bf) Γf=σ(Wf[a<t1>,x<t>]+bf)

输入门 Γ u Γ_u Γu:考虑当前输入 x < t > x^{<t>} x<t>上一时间步的隐藏状态 a < t − 1 > a^{<t-1>} a<t1>, 输出是一个逐元素向量,值范围在[0,1]
将来要使用这个范围在[0,1]的逐元素向量候选值 c ~ < t > \tilde c^{<t>} c~<t>相乘,用于控制候选值中哪些部分需要加入到长期记忆细胞 c < t > c^{<t>} c<t>
Γ u = σ ( W u [ a < t − 1 > , x < t > ] + b u ) Γ_u= σ(W_u[a^{<t-1>}, x^{<t>}]+bu) Γu=σ(Wu[a<t1>,x<t>]+bu)

输出门 Γ o Γ_o Γo:考虑当前输入 x < t > x^{<t>} x<t>上一时间步的隐藏状态 a < t − 1 > a^{<t-1>} a<t1>, 输出是一个逐元素向量,值范围在[0,1]
将来要使用这个范围在[0,1]的逐元素向量长期记忆状态的非线性激活值 t a n h ( c < t > ) tanh(c^{<t>}) tanh(c<t>) 相乘,得到当前隐藏状态 a < t > a^{<t>} a<t>
Γ o = σ ( W o [ a < t − 1 > , x < t > ] + b o ) Γ_o= σ(W_o[a^{<t-1>}, x^{<t>}]+bo) Γo=σ(Wo[a<t1>,x<t>]+bo)

更新门:
c < t > = Γ u ∗ c ~ < t > + ( Γ f ) ∗ c < t − 1 > c^{<t>}= Γ_u* \tilde c^{<t>}+(Γ_f)*c^{<t-1>} c<t>=Γuc~<t>+(Γf)c<t1>
a < t > = Γ o ∗ t a n h ( c < t > ) a^{<t>}= Γ_o*tanh(c^{<t>}) a<t>=Γotanh(c<t>)

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com