NLP常问问题
@[Work]
文章目录
基础问题
tfidf
词频: 指的是某一个给定的词语在文档中出现的频率
t
f
i
,
j
=
n
i
,
j
∑
k
n
k
,
j
\mathrm{tf}_{\mathrm{i}, \mathrm{j}}=\frac{n_{i, j}}{\sum_{k} n_{k, j}}
tfi,j=∑knk,jni,j
逆文档频率: 总文件数量除以包含该词语的文件数量
i
d
f
i
=
lg
∣
D
∣
∣
{
j
:
t
i
∈
d
j
}
∣
\mathrm{idf}_{\mathrm{i}}=\lg \frac{|D|}{\left|\left\{j : t_{i} \in d_{j}\right\}\right|}
idfi=lg∣{j:ti∈dj}∣∣D∣
tf-idf = 词频(tf) × 逆文档频率(idf)
HMM
HMM 假设是什么?HMM中的矩阵意义?
HMM有两个基本假设:
(1)齐次马尔科夫性假设,即假设隐藏的马尔科夫链在任意时刻t的状态只依赖于其前一时刻的状态,与其他时刻的状态及观测无关,也与时刻t无关。 (当前状态只依赖于前一时刻的状态)
(2)观测独立性假设,即假设任意时刻的观测只依赖于该时刻的马尔科夫链的状态,与其他观测及状态无关。 (当前的观测状态只依赖于当前所处的状态)
隐马尔可夫模型有初始状态概率向量 π \pi π、状态转移概率矩阵 A A A和观测概率矩阵 B B B决定
隐马尔可夫模型的3个基本问题
(1)概率计算问题。 给定模型
λ
=
(
A
,
B
,
π
)
\lambda = (A, B, \pi)
λ=(A,B,π)和观测序列
O
=
(
o
1
,
o
2
,
⋯
,
o
T
)
O=(o_1, o_2, \cdots, o_T)
O=(o1,o2,⋯,oT),计算在模型
λ
\lambda
λ下观测序列
O
O
O出现的概率
P
(
O
∣
λ
)
P(O|\lambda)
P(O∣λ)。 对于概率计算问题使用的方法是前向后向算法,时间复杂度是
O
(
N
2
T
)
O(N^2T)
O(N2T),其中
N
N
N是可能的状态数,
T
T
T表示的是序列的长度
(2)学习问题。已知观测序列
O
=
(
o
1
,
o
2
,
⋯
,
o
T
)
O=(o_1,o_2, \cdots, o_T)
O=(o1,o2,⋯,oT),估计模型
λ
=
(
A
,
B
,
π
)
\lambda=(A, B, \pi)
λ=(A,B,π)参数,使得在该模型下观测序列概率
P
(
O
∣
λ
)
P(O|\lambda)
P(O∣λ)最大。即用极大似然估计的方法估计参数,而对于带有隐状态的学习问题使用Baum-Welch来进行参数估计,其实就是使用EM算法实现。
(3)预测问题,也称为解码问题。已知模型
λ
=
(
A
,
B
,
π
)
\lambda=(A, B, \pi)
λ=(A,B,π)和观测序列
O
=
(
o
1
,
o
2
,
⋯
,
o
T
)
O=(o_1, o_2, \cdots, o_T)
O=(o1,o2,⋯,oT),求对给定观测序列条件概率
P
(
I
∣
O
)
P(I|O)
P(I∣O)最大的状态序列
I
=
(
i
1
,
i
2
,
⋯
,
i
T
)
I=(i_1,i_2,\cdots,i_T)
I=(i1,i2,⋯,iT)。即给定观测序列,求最有可能的对应的状态序列。使用维特比算法实现。
HMM前向算法(公式)
前向:
首先: 给定隐马尔科夫模型
λ
\lambda
λ,定义到时刻
t
t
t部分观测序列为
o
1
,
o
2
,
⋯
,
o
t
o_1,o_2, \cdots, o_t
o1,o2,⋯,ot且状态为
q
i
q_i
qi的概率为前向概率,记作:
α
t
(
i
)
=
P
(
o
1
,
o
2
,
⋯
,
o
t
,
i
t
=
q
i
∣
λ
)
\alpha_t(i) = P(o_1,o_2, \cdots, o_t, i_t=q_i | \lambda)
αt(i)=P(o1,o2,⋯,ot,it=qi∣λ)
可以递推地观测序列概率
P
(
O
∣
λ
)
P(O|\lambda)
P(O∣λ)
(1)初值:
α
1
(
i
)
=
π
i
b
i
(
o
1
)
,
i
=
1
,
2
,
⋯
,
N
\alpha_{1}(i)=\pi_{i} b_{i}\left(o_{1}\right), \quad i=1,2, \cdots, N
α1(i)=πibi(o1),i=1,2,⋯,N
(2)递推
t
=
1
,
2
,
⋯
,
T
−
1
t = 1, 2, \cdots, T - 1
t=1,2,⋯,T−1:
α
t
+
1
(
i
)
=
[
∑
j
=
1
K
α
i
(
j
)
a
j
i
]
b
i
(
o
t
+
1
)
,
i
=
1
,
2
,
⋯
,
N
\alpha_{t+1}(i)=\left[\sum_{j=1}^{K} \alpha_{i}(j) a_{ji}\right] b_{i}\left(o_{t+1}\right), \quad i=1,2, \cdots, N
αt+1(i)=[j=1∑Kαi(j)aji]bi(ot+1),i=1,2,⋯,N
每次递推同样由两部分构成,括号中是当前状态为i且观测序列的前t个符合要求的概率,括号外的是状态i发射观测t+1的概率。
(3)终止
P
(
O
∣
λ
)
=
∑
i
=
1
N
α
T
(
i
)
P(O|\lambda) = \sum_{i = 1}^N \alpha_T(i)
P(O∣λ)=i=1∑NαT(i)
由于到了时间T,一共有N种状态发射了最后那个观测,所以最终的结果要将这些概率加起来(因为每个隐状态都可能产生我们需要的观测值,所以都要加起来)。
HMM后向算法(公式)
后向:
首先: 给定隐马尔科夫模型
λ
\lambda
λ,定义在时刻
t
t
t状态为
q
i
q_i
qi的条件下,从
t
+
1
t+1
t+1到
T
T
T的部分观测序列为
o
t
+
1
,
o
t
+
2
,
⋯
,
o
T
o_{t+1},o_{t+2}, \cdots, o_T
ot+1,ot+2,⋯,oT的概率为后向概率,记作:
β
t
(
i
)
=
P
(
o
t
+
1
,
o
t
+
2
,
⋯
,
o
t
∣
i
t
=
q
i
,
λ
)
\beta_{t}(i)=P\left(o_{t+1}, o_{t+2}, \cdots, o_{t} | i_{t}=q_{i}, \lambda\right)
βt(i)=P(ot+1,ot+2,⋯,ot∣it=qi,λ)
(1) 初值
β
T
(
i
)
=
1
,
i
=
1
,
2
,
⋯
,
N
\beta_{T}(i)=1, \quad i=1,2, \cdots, N
βT(i)=1,i=1,2,⋯,N
(2) 对于
t
=
T
−
1
,
T
−
2
,
⋯
,
1
t=T-1,T-2, \cdots, 1
t=T−1,T−2,⋯,1
β
t
(
i
)
=
∑
i
=
1
N
a
i
j
b
j
(
o
i
+
1
)
β
t
+
1
(
j
)
,
i
=
1
,
2
,
⋯
,
N
\beta_{t}(i)=\sum_{i=1}^{N} a_{ij} b_{j}\left(o_{i+1}\right) \beta_{t+1}(j), i=1,2, \cdots, N
βt(i)=i=1∑Naijbj(oi+1)βt+1(j),i=1,2,⋯,N
简单推导:
β
t
+
1
(
j
)
=
P
(
o
t
+
2
,
⋯
,
o
t
∣
i
t
+
1
=
q
j
,
λ
)
β
t
(
i
)
=
P
(
o
t
+
1
,
o
t
+
2
,
⋯
,
o
t
∣
i
t
=
q
i
,
λ
)
=
∑
j
=
1
N
P
(
o
t
+
1
,
o
t
+
2
,
⋯
,
o
t
,
i
t
+
1
=
q
j
∣
i
t
=
q
i
,
λ
)
=
∑
j
=
1
N
P
(
o
t
+
1
∣
o
t
+
2
,
⋯
,
o
t
,
i
t
+
1
=
q
j
,
i
t
=
q
i
,
λ
)
P
(
o
t
+
2
,
⋯
,
o
t
,
i
t
+
1
=
q
j
∣
i
t
=
q
i
,
λ
)
=
∑
j
=
1
N
P
(
o
t
+
1
∣
o
t
+
2
,
⋯
,
o
t
,
i
t
+
1
=
q
j
,
i
t
=
q
i
,
λ
)
P
(
i
t
+
1
=
q
j
∣
o
t
+
2
,
⋯
,
o
t
,
i
t
=
q
i
,
λ
)
P
(
o
t
+
2
,
⋯
,
o
t
∣
i
t
+
1
=
q
j
,
λ
)
=
∑
j
=
1
N
P
(
o
t
+
1
∣
i
t
+
1
=
q
j
)
P
(
i
t
+
1
=
q
j
∣
i
t
=
q
j
)
β
t
+
1
(
j
)
=
∑
j
=
1
N
a
i
j
b
j
(
o
t
+
1
)
β
t
+
1
(
j
)
\beta_{t + 1}(j)=P\left(o_{t+2}, \cdots, o_{t} | i_{t+1}=q_{j}, \lambda\right) \\ \beta_{t}(i)=P\left(o_{t+1}, o_{t+2}, \cdots, o_{t} | i_{t}=q_{i}, \lambda\right) \\ = \sum_{j=1}^N P\left(o_{t+1}, o_{t+2}, \cdots, o_{t}, i_{t+1} = q_j | i_{t}=q_{i}, \lambda\right) \\ =\sum_{j=1}^N P\left(o_{t+1} | o_{t+2}, \cdots, o_{t}, i_{t+1} = q_j, i_{t}=q_{i}, \lambda\right) P( o_{t+2}, \cdots, o_{t}, i_{t+1} = q_j | i_{t}=q_{i}, \lambda) \\ =\sum_{j=1}^N P\left(o_{t+1} | o_{t+2}, \cdots, o_{t}, i_{t+1} = q_j, i_{t}=q_{i}, \lambda\right) P( i_{t+1} = q_j | o_{t+2}, \cdots, o_{t}, i_{t}=q_{i}, \lambda) P\left(o_{t+2}, \cdots, o_{t} | i_{t+1}=q_{j}, \lambda\right) \\ = \sum_{j=1}^N P(o_{t+1} | i_{t+1} = q_j) P(i_{t+1} = q_j | i_t=q_j)\beta_{t + 1}(j) \\ = \sum_{j=1}^{N} a_{ij} b_{j}\left(o_{t+1}\right) \beta_{t+1}(j)
βt+1(j)=P(ot+2,⋯,ot∣it+1=qj,λ)βt(i)=P(ot+1,ot+2,⋯,ot∣it=qi,λ)=j=1∑NP(ot+1,ot+2,⋯,ot,it+1=qj∣it=qi,λ)=j=1∑NP(ot+1∣ot+2,⋯,ot,it+1=qj,it=qi,λ)P(ot+2,⋯,ot,it+1=qj∣it=qi,λ)=j=1∑NP(ot+1∣ot+2,⋯,ot,it+1=qj,it=qi,λ)P(it+1=qj∣ot+2,⋯,ot,it=qi,λ)P(ot+2,⋯,ot∣it+1=qj,λ)=j=1∑NP(ot+1∣it+1=qj)P(it+1=qj∣it=qj)βt+1(j)=j=1∑Naijbj(ot+1)βt+1(j)
(3)
P
(
O
∣
λ
)
=
∑
i
=
1
N
π
i
b
i
(
o
1
)
β
1
(
i
)
P(O | \lambda)=\sum_{i=1}^{N} \pi_{i} b_{i}\left(o_{1}\right) \beta_{1}(i)
P(O∣λ)=i=1∑Nπibi(o1)β1(i)
HMM中的维特比算法
定义在时刻
t
t
t状态为
i
i
i的所有单个路径
(
i
1
,
i
2
,
⋯
,
i
t
)
(i_1, i_2, \cdots, i_t)
(i1,i2,⋯,it)中概率最大值为:
δ
t
(
i
)
=
max
i
1
,
i
2
,
⋯
,
i
t
−
1
P
(
i
t
=
i
,
i
t
−
1
,
⋯
,
i
1
,
o
t
,
⋯
,
o
1
∣
λ
)
,
i
=
1
,
2
,
⋯
,
N
\delta_{t}(i)=\max _{i_{1}, i_2, \cdots, i_{t-1}} P\left(i_{t}=i, i_{t-1}, \cdots, i_{1}, o_{t}, \cdots, o_{1} | \lambda\right), \quad i=1,2, \cdots, N
δt(i)=i1,i2,⋯,it−1maxP(it=i,it−1,⋯,i1,ot,⋯,o1∣λ),i=1,2,⋯,N
δ
t
+
1
(
i
)
=
max
i
1
,
i
2
,
⋯
,
i
t
P
(
i
t
+
1
=
i
,
i
t
,
⋯
,
i
1
,
o
t
+
1
,
⋯
,
o
1
∣
λ
)
=
m
a
x
1
≤
j
≤
N
δ
,
i
=
1
,
2
,
⋯
,
N
\delta_{t + 1}(i)=\max _{i_{1}, i_2, \cdots, i_{t}} P\left(i_{t+1}=i, i_{t}, \cdots, i_{1}, o_{t+1}, \cdots, o_{1} | \lambda\right) \\ = max_{1 \leq j \leq N}\delta , \quad i=1,2, \cdots, N
δt+1(i)=i1,i2,⋯,itmaxP(it+1=i,it,⋯,i1,ot+1,⋯,o1∣λ)=max1≤j≤Nδ,i=1,2,⋯,N
定义在时刻
t
t
t状态
i
i
i的所有单个路径
(
i
1
,
i
2
,
⋯
,
i
t
−
1
,
i
)
(i_1, i_2, \cdots, i_{t-1}, i)
(i1,i2,⋯,it−1,i)中概率最大的路径的第
t
−
1
t-1
t−1个结点为:
ψ
t
(
i
)
=
arg
max
1
⩽
j
⩽
N
[
δ
t
−
1
(
j
)
a
j
i
]
,
i
=
1
,
2
,
⋯
,
N
\psi_{t}(i)=\arg \max _{1 \leqslant j \leqslant N}\left[\delta_{t-1}(j) a_{j i}\right], \quad i=1,2, \cdots, N
ψt(i)=arg1⩽j⩽Nmax[δt−1(j)aji],i=1,2,⋯,N
公式:
(1)初始化
δ 1 ( i ) = π i b i ( o 1 ) , i = 1 , 2 , ⋯ , N ψ 1 ( i ) = 0 , i = 1 , 2 , ⋯ , N \begin{array}{cl}{\delta_{1}(i)=\pi_{i} b_{i}\left(o_{1}\right),} & {i=1,2, \cdots, N} \\ {\psi_{1}(i)=0,} & {i=1,2, \cdots, N}\end{array} δ1(i)=πibi(o1),ψ1(i)=0,i=1,2,⋯,Ni=1,2,⋯,N
(2)递推, 对 t = 2 , 3 , , ⋯ , T t = 2, 3, , \cdots, T t=2,3,,⋯,T
δ t ( i ) = max 1 ≤ j ≤ N [ δ t − 1 ( j ) a j i ] b i ( o t ) , i = 1 , 2 , ⋯ , N ψ t ( i ) = arg max i < j < N [ δ t − 1 ( j ) a j i ] , i = 1 , 2 , ⋯ , N \begin{array}{ll}{\delta_{t}(i)=\max _{1 \leq j \leq N}\left[\delta_{t-1}(j) a_{j i}\right] b_{i}\left(o_{t}\right),} & {i=1,2, \cdots, N} \\ {\psi_{t}(i)=\arg \max _{i<j<N}\left[\delta_{t-1}(j) a_{j i}\right],} & {i=1,2, \cdots, N}\end{array} δt(i)=max1≤j≤N[δt−1(j)aji]bi(ot),ψt(i)=argmaxi<j<N[δt−1(j)aji],i=1,2,⋯,Ni=1,2,⋯,N
(3)终止
P ∗ = max 1 ≤ i ≤ N δ T ( i ) i ¨ T = arg max 1 ⩽ i ⩽ N [ δ T ( i ) ] \begin{array}{c}{P^{*}=\max _{1 \leq i \leq N} \delta_{T}(i)} \\ {\ddot{i}_{T}=\arg \max _{1 \leqslant i \leqslant N}\left[\delta_{T}(i)\right]}\end{array} P∗=max1≤i≤NδT(i)i¨T=argmax1⩽i⩽N[δT(i)]
(4)最优路径回溯。 对于 t = T − 1 , T − 2 , ⋯ , 1 t=T-1, T-2, \cdots, 1 t=T−1,T−2,⋯,1
i t ∗ = ψ t + 1 ( i t + 1 ∗ ) i_{t}^{*}=\psi_{t+1}\left(i_{t+1}^{*}\right) it∗=ψt+1(it+1∗)
求得最优路径 I ∗ = ( i 1 ∗ , i 2 ∗ , ⋯ , i T ∗ ) I^* = (i_1^*, i_2^*, \cdots, i^*_T) I∗=(i1∗,i2∗,⋯,iT∗)
CRF
CRF层可以加入一些约束来保证最终预测结果的有效性。这些约束可以在训练数据时被CRF层自动学习到。
CRF解决了什么问题?
crf与hmm一样,也有三个典型问题——概率计算问题、学习问题以及预测问题(解码问题)。除了模型参数学习的问题求解方法与HMM不同之外,概率计算问题和解码问题使用的算法思想是相同的。
对于学习问题,crf学习问题使用的学习方法包括极大似然估计和正则化的极大似然估计。具体的优化实现算法有改进的迭代尺度法IIS、梯度下降法以及拟牛顿法。
CRF的损失函数是什么?
CRF损失函数由两部分组成,真实路径的分数和所有路径的总分数。真实路径的分数应该是所有路径中分数最高的。
每种可能的路径的分数为
P
i
P_i
Pi,共有N条路径,则路径的总分是:
P
total
=
P
1
+
P
2
+
…
+
P
N
=
e
S
1
+
e
S
2
+
…
+
e
S
N
P_{\text {total}}=P_{1}+P_{2}+\ldots+P_{N}=e^{S_{1}}+e^{S_{2}}+\ldots+e^{S_{N}}
Ptotal=P1+P2+…+PN=eS1+eS2+…+eSN
如果第
i
i
i条是真实路径,也就是说第
i
i
i条是正确预测的结果,那么第
i
i
i条路径的分数应该是所有可能路径里得分最高的。
=
P
R
e
a
l
P
a
t
h
P
1
+
P
2
+
…
+
P
N
=\frac{P_{RealPath}}{P_{1}+P_{2}+\ldots+P_{N}}
=P1+P2+…+PNPRealPath
对于路径的分数主要包含了两部分的得分,一是状态分数,二是转移分数
答案在 https://zhuanlan.zhihu.com/p/57153934
在linear-CRF中,特征函数分为两类,第一类是定义在
Y
Y
Y结点上的节点特征函数,这类特征函数值与当前结点有关,记为
s
l
(
y
i
,
x
,
i
)
,
l
=
1
,
2
,
⋯
,
L
s_l(y_i, x, i), \qquad l = 1, 2, \cdots, L
sl(yi,x,i),l=1,2,⋯,L
其中,
L
L
L是定义在该节点的节点特征函数的总个数(即不同的状态数),
i
i
i是当前结点的位置
第二类是定义在
Y
Y
Y上下文的局部特征函数,这类特征函数只和当前结点和上一个结点有关,记为:
t
k
(
y
i
−
1
,
y
i
,
x
,
i
)
,
k
=
1
,
2
,
…
K
t_{k}\left(y_{i-1}, y_{i}, x, i\right), \qquad k=1,2, \dots K
tk(yi−1,yi,x,i),k=1,2,…K
其中
K
K
K是定义在该节点的局部特征函数的总个数,
i
i
i是当前结点在序列的位置。之所以只有上下文相关的局部特征函数,没有不相邻结点之间的特征函数,是因为linear-CRF满足马尔科夫性。
无论是结点特征函数
s
l
s_l
sl还是局部特征函数
t
k
t_k
tk,他们的取值只能是0或者1。满则特征条件或者不满则特征条件。同时,我们可以为每个特征函数赋予一个权值,用以表达我们对这个特征函数的信任度。假设
t
k
t_k
tk的权重系数是
λ
k
\lambda_k
λk,
s
l
s_l
sl的权重系数是
μ
l
\mu_l
μl, 则linear-CRF由所有的
t
k
,
λ
k
,
s
l
,
μ
l
t_k, \lambda_k, s_l, \mu_l
tk,λk,sl,μl共同决定。
线性链条件随机场的参数化形式: 设
P
(
Y
∣
X
)
P(Y|X)
P(Y∣X)为线性链条件随机场,则在随机变量
X
X
X取值为
x
x
x的条件下,随机变量
Y
Y
Y取值为
y
y
y的条件概率具有如下形式:
P
(
y
∣
x
)
=
1
Z
(
x
)
e
x
p
(
∑
i
,
k
λ
k
t
k
(
y
i
−
1
,
y
i
,
x
,
i
)
+
∑
i
,
l
μ
l
s
l
(
y
i
,
x
,
i
)
)
(*)
P(y|x) = \frac{1}{Z(x)} exp \left ( \sum_{i,k} \lambda_k t_k(y_{i-1}, y_i, x, i) + \sum_{i, l} \mu_l s_l(y_i, x, i)\right ) \tag{*}
P(y∣x)=Z(x)1exp⎝⎛i,k∑λktk(yi−1,yi,x,i)+i,l∑μlsl(yi,x,i)⎠⎞(*)
其中
Z
(
x
)
=
∑
y
e
x
p
(
∑
i
,
k
λ
k
t
k
(
y
i
−
1
,
y
i
,
x
,
i
)
+
∑
i
,
l
μ
l
s
l
(
y
i
,
x
,
i
)
)
Z(x) = \sum_yexp \left ( \sum_{i,k} \lambda_k t_k(y_{i-1}, y_i, x, i) + \sum_{i, l} \mu_l s_l(y_i, x, i)\right )
Z(x)=y∑exp⎝⎛i,k∑λktk(yi−1,yi,x,i)+i,l∑μlsl(yi,x,i)⎠⎞
HMM、MEMM和CRF对比 *
答案在 https://zhuanlan.zhihu.com/p/57153934
(1)HMM是有向图模型,是生成模型;HMM有两个假设:齐次马尔科夫性假设和观测独立性假设;
(2)MEMM(最大熵马尔科夫模型)是有向图模型,是判别模型;MEMM打破了HMM的观测独立性假设,MEMM考虑到相邻状态之间依赖关系,且考虑整个观察序列,因此MEMM的表达能力更强;但MEMM会带来标注偏置问题:由于局部归一化问题,MEMM倾向于选择拥有更少状态专一的状态。这就是标记偏置问题。
P
(
y
1
:
n
∣
x
1
:
n
)
=
∏
i
=
1
n
P
(
y
i
∣
y
i
−
1
,
x
1
:
n
)
=
∏
i
=
1
n
e
x
p
(
w
T
f
(
y
i
,
y
i
−
1
,
x
1
:
n
)
)
Z
(
y
i
−
1
,
x
1
:
n
)
P\left(\mathbf{y}_{1 : n} | \mathbf{x}_{1 : n}\right)=\prod_{i=1}^{n} P\left(y_{i} | y_{i-1}, \mathbf{x}_{1 : n}\right) = \prod_{i=1}^{n} \frac{exp(w^Tf(y_i, y_{i-1}, \mathbf{x}_{1:n}))}{Z(y_{i-1}, \mathbf{x}_{1:n})}
P(y1:n∣x1:n)=i=1∏nP(yi∣yi−1,x1:n)=i=1∏nZ(yi−1,x1:n)exp(wTf(yi,yi−1,x1:n))
最大熵马尔科夫模型存在偏置问题
标注偏置
用Viterbi算法解码MEMM,状态1倾向于转换到状态2,同时状态2倾向于保留在状态2。 解码过程细节(需要会viterbi算法这个前提):
- P(1-> 1-> 1-> 1)= 0.4 x 0.45 x 0.5 = 0.09 ,
- P(2->2->2->2)= 0.2 X 0.3 X 0.3 = 0.018,
- P(1->2->1->2)= 0.6 X 0.2 X 0.5 = 0.06,
- P(1->1->2->2)= 0.4 X 0.55 X 0.3 = 0.066
但是得到的最优的状态转换路径是1->1->1->1,为什么呢?因为状态2可以转换的状态比状态1要多,从而使转移概率降低,即MEMM倾向于选择拥有更少转移的状态。
直接看MEMM的公式:
P
(
I
∣
O
)
=
∏
t
=
1
n
exp
(
∑
a
)
λ
a
f
a
(
o
,
i
)
Z
(
o
,
i
i
−
1
)
,
i
=
1
,
⋯
,
n
P(I | O)=\prod_{t=1}^{n} \frac{\exp \left(\sum_{a}\right) \lambda_{a} f_{a}(o, i)}{Z\left(o, i_{i-1}\right)}, i=1, \cdots, n
P(I∣O)=t=1∏nZ(o,ii−1)exp(∑a)λafa(o,i),i=1,⋯,n
从状态2转移出去可能的状态包括1、2、3、4、5,概率在可能的状态上分散了,而状态1转移出去的可能状态仅仅为状态1和2,概率更加集中。由于局部归一化的影响,隐状态会倾向于转移到哪些后续状态可能更少的状态上,以提高整体的后验概率,这就是标注偏置问题。
(3) CRF模型解决了标注偏置问题,去除了HMM中两个不合理的假设,当然,模型也相应的变得更加复杂了。
三个模型 优缺点的比较
- 与HMM比较。CRF没有HMM那样严格的独立性假设条件,因而可以容纳任意的上下文信息,特征设计灵活
- 与MEMM比较。由于CRF计算全局最优输出节点的条件概率,它还克服了最大熵马尔科夫模型标注偏置的缺点
- 与ME相比,CRF是在给定需要标记的观察序列的条件下,计算整个标记序列的联合概率分布,而不是在给定当前状态条件下,定义下一个状态的状态分布
HMM模型一个最大的缺点就是由于其输出独立性假设,导致其不能考虑上下文的特征,限制了特征的选择
MEMM模型则解决了HMM的问题,可以任意选择特征,但由于其在每一节点都要进行归一化,所以只能找到局部的最优值,同时也带来了标记偏见的问题,即凡是训练语料中未出现的情况全都忽略掉。
条件随机场则很好的解决了这一问题,他并不在每一个节点进行归一化,而是所有特征进行全局归一化,因此可以求得全局的最优值。
LDA专题
LDA生成一篇文档的流程:
- 按照先验概率 P ( d i ) P(d_i) P(di)选择一篇文档 d i d_i di
- 从狄利克雷分布 α \alpha α中取样生成文档 d i d_i di的主题分布 θ i \theta_i θi,换言之,主题分布 θ i \theta_i θi由超参数为 α \alpha α的Dirichlet分布生成
- 从主题的多项式分布 θ i \theta_i θi中取样生成文档 d i d_i di第 j j j个词的主题 z i , j z_{i,j} zi,j
- 从狄利克雷分布 β \beta β中取样生成主题 z i , j z_{i,j} zi,j对应的词语分布 ϕ z i , j \phi_{z_{i,j}} ϕzi,j,换言之,词语分布 ϕ z i , j \phi_{z_{i,j}} ϕzi,j由参数为 β \beta β的Dirichlet分布生成
- 从词语的多项式分布 ϕ z i , j \phi_{z_{i,j}} ϕzi,j中采样最终生成词语 w i , j w_{i,j} wi,j
LDA和pLSA有什么区别?
LDA可以看作是pLSA的贝叶斯版本,其文本生成过程与pLSA基本相同,不同的是为主题分布和词分布分别加了两个狄利克雷(Dirichlet)先验。为什么要加入狄利克雷先验呢?这就要从频率学派和贝叶斯学派的区别说起。pLSA采用的是频率派思想,将每篇文章对应的主题分布 p ( z ∣ d ) p(z|d) p(z∣d)和每个主题对应的词分布 p ( w ∣ z ) p(w|z) p(w∣z)看成确定的未知常数,并可以利用EM算法求解出来;
而LDA采用的是贝叶斯学派的思想,认为待估计的参数(主题分布和词分布)不再是一个固定的常数,而是服从一定分布的随机变量。这个分布符合一定的先验概率分布(即狄利克雷分布),并且在观察到样本信息之后,可以对先验分布进行修正,从而得到后验分布。LDA之所以选择狄利克雷分布作为先验分布,是因为它为多项式分布的共轭先验概率分布,后验概率依然服从狄利克雷分布,这样做可以为计算带来便利。
PLSA
p
(
w
∣
d
)
=
∑
z
Z
p
(
w
,
z
∣
d
)
=
∑
z
Z
p
(
w
∣
d
,
z
)
p
(
z
∣
d
)
=
∑
z
Z
p
(
w
∣
z
)
p
(
z
∣
d
)
p(w | d)=\sum_{z}^{Z} p(w, z | d)=\sum_{z}^{Z} p(w | d, z) p(z | d)=\sum_{z}^{Z} p(w | z) p(z | d)
p(w∣d)=z∑Zp(w,z∣d)=z∑Zp(w∣d,z)p(z∣d)=z∑Zp(w∣z)p(z∣d)
* 词向量专题
分布式假设: 相同上下文语境的词有相似的含义
词向量的弊端: 每个词一个固定表征,无法解决一词多义的问题
#文本表示和各词向量间的对比
文本表示哪些方法?
下面对文本表示进行一个归纳,也就是对于一篇文本可以如何用数学语言表示呢?
- 基于one-hot、tf-idf、textrank等的bag-of-words;
- 主题模型:LSA(SVD)、pLSA、LDA;
- 基于词向量的固定表征:word2vec、fastText、glove
- 基于词向量的动态表征:elmo、GPT、bert
怎么从语言模型理解词向量?怎么理解分布式假设?
上面给出的4个类型也是nlp领域最为常用的文本表示了,文本是由每个单词构成的,而谈起词向量,one-hot是可认为是最为简单的词向量,但存在维度灾难和语义鸿沟等问题;通过构建共现矩阵并利用SVD求解构建词向量,则计算复杂度高;而早期词向量的研究通常来源于语言模型,比如NNLM和RNNLM,其主要目的是语言模型,而词向量只是一个副产物。
所谓分布式假设,用一句话可以表达:相同上下文语境的词有相似含义。而由此引申出了word2vec、fastText,在此类词向量中,虽然其本质仍然是语言模型,但是它的目标并不是语言模型本身,而是词向量,其所作的一系列优化,都是为了更好的得到词向量。glove则是基于全局语料库、并结合上下文语境构建词向量,结合了LSA和word2vec的优点。
传统的词向量有什么问题?怎么解决?各种词向量的特点是什么?
词向量时固定表征,无法解决一词多义等问题,如“川普”。为此引入基于语言模型的动态表征方法: elmo、 GPT、 BERT
各种词向量的特点
(1) One-hot表示: 维度灾难,语义鸿沟
(2) 分布式表示
- 矩阵分解(LSA):利用全局语料特征,但SVD求解计算复杂度大;
- 基于NNLM/RNNLM的词向量:词向量为副产物,存在效率不高等问题;
- word2vec、fastText:优化效率高,但是基于局部语料;
- glove:基于全局预料,结合了LSA和word2vec的优点;
- elmo、GPT、bert:动态特征;
Word2Vec
详细的word2vec的介绍查看: https://blog.csdn.net/itplus/article/details/37969519
这个教程更容易理解: https://www.cnblogs.com/pinard/p/7243513.html
Word2Vec的推导
参照LR的推导
Word2Vec的两种模型分别是什么?
word2Vec 有两种模型:CBOW 和 Skip-Gram:
CBOW模型是已知上下文的词context(w)
去预测w
Skip-Gram模型是使用当前词w
去预测上下文的词context(w)
CBOW是对输入进行迭代更新, 而Skip-Gram是对 2 c 2c 2c个输出进行迭代更新
word2vec的两种优化方法是什么?它们的目标函数怎样确定的?训练过程又是怎样的?
不经优化的CBOW和skip-gram,在每个样本中每个词的训练过程都要遍历整个词汇表,也就是都需要经过softmax归一化,计算误差向量和梯度以更新两个词向量矩阵(这两个词向量矩阵实际上就是最终的词向量,可认为初始化不一样),当语料库规模变大、词汇表增长时,训练变得不切实际。为了解决这个问题,word2vec支持两种优化方法: hierarchical softmax 和negative sampling。
Word2Vec为什么会使用哈夫曼树
为了避免要计算所有词的softmax概率。使用哈夫曼树来代替从隐藏层到输出层softmax层的映射。这样计算量从原先
V
V
V减少到
l
o
g
V
logV
logV,因为使用的是哈夫曼树,平均下来应该会更少
因为不同的词在语料库中出现的频率是不一样的,采用哈夫曼树能够使得出现频率高的词语被分配短的搜寻路径,从而加快模型的训练速度
Word2Vec为什么会使用负采样(负采样的作用)
的确,使用哈夫曼树来代替传统的神经网络,可以提高模型的训练效率。如果我们的训练样本里的中心词w是一个很生僻的词,那么就得在霍夫曼树中辛苦的向下走很久了。
负采样这个点引入word2vec非常巧妙,两个作用:
- 加速了模型计算, 一个模型每次只需要更新采样的词的权重,不需要更新所有的权重,那样会很慢
- 保证了模型训练的效果, 中心词其实只跟它周围的词有关系,位置离得很远的词没有什么关系,同时也没有必要同时训练更新。
Glove
参考: http://www.fanyeong.com/2018/02/19/glove-in-detail/
Glove的全称叫Global Vectors for Word Representation,它是一个基于全局词频统计的词表征工具, 它的核心在于使用词向量表达贡献概率比值。
Glove的构建过程
(1)根据语料库构建一个共现矩阵
X
X
X,矩阵中的每一个元素
X
i
j
X_{ij}
Xij代表单词
i
i
i和上下文单词
j
j
j在特定大小的上下文窗口内共同出现的次数。但Glove的与众不同在于它不认为窗口中贡献的次数的最小单位是1,它是根据两个单词在上下文窗口的距离
d
d
d,提出了一个衰减函数
d
e
c
a
y
=
1
/
d
decay = 1/d
decay=1/d用于计算权重,也就是说距离越远的两个单词所占总计数的权重越小。
(2) 构建词向量和共现矩阵之间的近似关系,使用以下公式近似表达两者之间的关系:
w
i
T
w
~
j
+
b
i
+
b
~
j
=
log
(
X
i
j
)
w_{i}^{T} \tilde{w}_{j}+b_{i}+\tilde{b}_{j}=\log \left(X_{i j}\right)
wiTw~j+bi+b~j=log(Xij)
w
i
T
和
w
~
j
w_{i}^{T} 和\tilde{w}_{j}
wiT和w~j是最终要求解的词向量,
b
i
和
b
~
j
b_{i}和\tilde{b}_{j}
bi和b~j分别是两个词向量的偏置
(3)构造它的损失函数为:
J
=
∑
i
,
j
=
1
V
f
(
X
i
j
)
(
w
i
T
w
~
j
+
b
i
+
b
~
j
−
log
X
i
j
)
2
J=\sum_{i, j=1}^{V} f\left(X_{i j}\right)\left(w_{i}^{T} \tilde{w}_{j}+b_{i}+\tilde b_{j}-\log X_{i j}\right)^{2}
J=i,j=1∑Vf(Xij)(wiTw~j+bi+b~j−logXij)2
这个损失函数的基本形式就是最简单的mean square loss, 只不过在此基础上加了一个权重函数
f
(
x
i
j
)
f(x_{ij})
f(xij),添加这个权重是因为在一个语料库中,肯定存在很多单词他们在一起的数量会很多,那么我们希望:
- 一起出现次数多的单词比一起出现次数少的单词的权重大一些,因此这是个非递减函数
- 但也不希望权重过大,因此到达一定程度后不再增加
- 两个单词没有一起出现过的话那么我们希望它不参与到损失计算中,也就是 f ( 0 ) = 0 f(0) = 0 f(0)=0
满足条件的函数很多,采用以下形式的分段函数
f
(
x
)
=
{
(
x
/
x
max
)
α
if
x
<
x
max
1
otherwise
f(x)=\left\{\begin{array}{ll}{\left(x / x_{\max }\right)^{\alpha}} & {\text { if } x<x_{\max }} \\ {1} & {\text { otherwise }}\end{array}\right.
f(x)={(x/xmax)α1 if x<xmax otherwise
根据实验发现
x
m
a
x
x_{max}
xmax的值对结果的影响并不是很大,原作者采用了
x
m
a
x
=
100
x_{max}=100
xmax=100。而
α
=
3
4
\alpha=\frac{3}{4}
α=43时的结果要比
α
=
1
\alpha=1
α=1时要更好。下面是
α
=
1
\alpha=1
α=1时要更好。下面是
α
=
3
4
\alpha=\frac{3}{4}
α=43时
f
(
x
)
f(x)
f(x)的函数图像,可以看出对于较小的
X
i
j
X_{ij}
Xij,权值也较小。这个函数图像如下所示:
GloVe的训练过程是怎样的?
- 实质上还是监督学习:虽然glove不需要人工标注为无监督学习,但实质还是有label就是 l o g ( X i j ) log(X_{ij}) log(Xij)
- 向量 w w w和 w ~ \tilde{w} w~为学习参数,本质上与监督学习的训练方法一样,采用AdaGrad的梯度下降算法,对矩阵X中的所有非零元素进行随机采样,学习曲率设为0.05,在vector size小于300的情况下迭代50次,其他大小的vectors上迭代了100次,直至收敛。数据量足够时,词向量的维度为300时达到最佳,窗口大小为6-10时比较好(默认取8)。
- 最终学习得到的两个词向量是 w ~ \tilde{w} w~和 w w w,因为 X X X是对称的,所以从原理上将 w ~ \tilde{w} w~和 w w w,也是对称的,它们唯一的区别是初始化的值不一样,而导致最终的值不一样。所以这两者其实是等价的,都可以当成最终的结果来使用。但是为了提高鲁棒性,我们最终会选择两者之和 w ~ + w \tilde{w} + w w~+w作为最终的vector(两者的初始化不同相当于不同的随机噪声,所以能提高鲁棒性)
Glove损失函数是如何确定的?(模型推导)
- X i j X_{ij} Xij表示单词j出现在单词 i i i的上下文中的次数
- X i X_i Xi表示单词 i i i的上下文中所有单词出现的总次数,即 X i = ∑ k X i k X_i=\sum_kX_{ik} Xi=∑kXik
-
P
i
j
=
P
(
j
∣
i
)
=
X
i
j
X
i
P_{ij} = P(j|i)=\frac{X_{ij}}{X_i}
Pij=P(j∣i)=XiXij
由以上概念引申出共现概率矩阵, 以论文中的例子:
该矩阵中的第一个元素为ice出现是solid出现的概率,第二个元素为ice出现时gas出现的该概率,以此类推。上图说明通过概率的比例而不是概率本身去学习词向量可能是一个更恰当的方法。
由词共现概率矩阵可以看出比例 R a t i o = P i k P j k Ratio=\frac{P_{ik}}{P_{jk}} Ratio=PjkPik的取值是有一定的规律的。
也就是说Radio值能够反映word之间的相关性,而Glove模型就是利用了这个Ratio值。
在明确一下,Glove模型的目标就是获取每一个word的向量表示v。不防假设现在已经得到了word i , j , k i, j, k i,j,k的词向量 w i , w j , w k w_i, w_j, w_k wi,wj,wk。Glove认为,这三个向量通过某种函数的作用后所呈现出来的规律和 R a d i o = P i k P j k Radio=\frac{P_{ik}}{P_{jk}} Radio=PjkPik具有一致性,即相等,也就可以认为词向量中包含了贡献概率矩阵中的信息。
假设这个未知的函数是 F F F,则:
F ( w i , w j , w k ) = P i k P j k F\left(w_{i}, w_{j}, w_{k}\right)=\frac{P_{i k}}{P_{j k}} F(wi,wj,wk)=PjkPik
此处可以类别word2vec的基本思想(以基于哈夫曼树的CBOW为例),假设word i i i和其context words的词向量已知,通过一层神经网络作用于context words的向量得到的结果与word i i i在哈夫曼树中的位置具有一致性。
开始模型推导
公式
F
(
w
i
,
w
j
,
w
k
)
=
P
i
k
P
j
k
F\left(w_{i}, w_{j}, w_{k}\right)=\frac{P_{i k}}{P_{j k}}
F(wi,wj,wk)=PjkPik
右侧的
P
i
k
P
j
k
\frac{P_{i k}}{P_{j k}}
PjkPik可以通过统计求得; 左侧的
w
i
,
w
j
,
w
k
w_{i}, w_{j}, w_{k}
wi,wj,wk是我们模型最终要求的量, 同时函数
F
F
F是未知的。
如果能够将函数 F F F的形式确定下来,就可以通过优化算法求解词向量了。那么Glove模型作者是如何将F确定下来的呢,开脑洞了。
- P i k P j k \frac{P_{i k}}{P_{j k}} PjkPik考察了 i , j , k i, j, k i,j,k三个word两两之间的相似关系,不妨单独考察 i , j i, j i,j两个词和他们词向量 w i , w j w_i, w_j wi,wj,线性空间中的相似关系自然想到的是两个向量之间的差 ( w i − w j ) (w_i - w_j) (wi−wj)。所以函数 F F F的形式变为: F ( w i − w j , w k ) = P i k P j k F\left(w_{i}-w_{j}, w_{k}\right)=\frac{P_{i k}}{P_{j k}} F(wi−wj,wk)=PjkPik
- P i k P j k \frac{P_{i k}}{P_{j k}} PjkPik是一个标量,而 F F F是作用在两个向量上的,向量和标量之间的关系自然想到了使用内积。所以 F F F函数的形式可以进一步确定为: F ( ( w i − w j ) T w k ) = F ( w i T w k − w j T w k ) = P i k P j k F\left((w_{i}-w_{j})^Tw_{k}\right)=F\left(w_{i}^Tw_{k}-w_{j}^Tw_{k}\right) =\frac{P_{i k}}{P_{j k}} F((wi−wj)Twk)=F(wiTwk−wjTwk)=PjkPik
- 到此为止模型公式的形式是 F ( w i T w k − w j T w k ) = P i k P j k F\left(w_{i}^Tw_{k}-w_{j}^Tw_{k}\right) =\frac{P_{i k}}{P_{j k}} F(wiTwk−wjTwk)=PjkPik。左边是差,右边时商,模型通过将 F F F取作exp来将差和熵和关联起来 exp ( w i T w k − w j T w k ) = exp ( w i T w k ) exp ( w j T w k ) = P i k P j k \exp \left(w_{i}^{T} w_{k}-w_{j}^{T} w_{k}\right)=\frac{\exp \left(w_{i}^{T} w_{k}\right)}{\exp \left(w_{j}^{T} w_{k}\right)}=\frac{P_{i k}}{P_{j k}} exp(wiTwk−wjTwk)=exp(wjTwk)exp(wiTwk)=PjkPik
- 现在只需要让分子分母分别相等上式就能够成立,所以 exp ( w i T w k ) = P i k , exp ( w j T w k ) = P j k \exp \left(w_{i}^{T} w_{k}\right)=P_{i k}, \exp \left(w_{j}^{T} w_{k}\right)=P_{j k} exp(wiTwk)=Pik,exp(wjTwk)=Pjk
- 所以只需要在整个文本库中考察 exp ( w i T w k ) = P i k = X i k X i \exp \left(w_{i}^{T} w_{k}\right)=P_{i k}=\frac{X_{ik}}{X_i} exp(wiTwk)=Pik=XiXik,即 w i T w k = log ( X i k X i ) = log X i k − log X i w_{i}^{T} w_{k}=\log \left(\frac{X_{i k}}{X_{i}}\right)=\log X_{i k}-\log X_{i} wiTwk=log(XiXik)=logXik−logXi
- 作为向量,交换 i i i和 k k k的顺序 w i T w k w_i^Tw_k wiTwk和 w k T w i w_k^Tw_i wkTwi是相等的,即公式左边对于 i i i和 k k k的顺序是不敏感的,但是公式右边交换 i i i和 k k k的顺序 log X i k − log X i ≠ log X k i − log X k \log X_{i k}-\log X_{i} \neq \log X_{k i}-\log X_{k} logXik−logXi=logXki−logXk。为了解决这个对称性问题,模型引入了两个偏置项 b i , b k b_i, b_k bi,bk,从而将模型变成了 log X i k = w i T w k + b i + b k \log X_{i k}=w_{i}^{T} w_{k}+b_{i}+b_{k} logXik=wiTwk+bi+bk其中 b i b_i bi中包含了 l o g X i logX_i logXi,所以公式中没有显示的写明这一项,为了保持模型的对称性,又加入了 b k b_k bk
- 上面的公式只是理想情况下,在实际实验中左右两边只能要求接近,从而就有了代价函数 J = ∑ i k ( w i T w k + b i + b k − log X i k ) 2 J=\sum_{i k}\left(w_{i}^{T} w_{k}+b_{i}+b_{k}-\log X_{i k}\right)^{2} J=ik∑(wiTwk+bi+bk−logXik)2
- 然后基于出现频率越高的词对权重应该越大的原则,在代价函数中添加权重项,于是代价函数进一步完善: J = ∑ i , j N f ( X i , j ) ( v i T v j + b i + b j − log ( X i , j ) ) 2 J=\sum_{i, j}^{N} f\left(X_{i, j}\right)\left(v_{i}^{T} v_{j}+b_{i}+b_{j}-\log \left(X_{i, j}\right)\right)^{2} J=i,j∑Nf(Xi,j)(viTvj+bi+bj−log(Xi,j))2
这个损失函数的基本形式就是最简单的mean square loss, 只不过在此基础上加了一个权重函数 f ( x i j ) f(x_{ij}) f(xij), 模型认为权重函数 f f f应该符合以下三个特点,1. f ( 0 ) = 0 f(0)=0 f(0)=0(如果两个词没有共同出现过,权重就是0); 2. f ( x ) f(x) f(x)必须是非减函数(两个词共同出现的次数多,反而权重变小了,违反了设置权重项的初衷); 3. f ( x ) f(x) f(x)对于较大的 x x x不能取太大的值(就像是汉语中“的”这个字,在很多文章中都会出现很多次,但是其在稳重的重要程度非常小)。 f ( x ) f(x) f(x)的公式如下:
f ( x ) = { ( x / x max ) α if x < x max 1 otherwise f(x)=\left\{\begin{array}{ll}{\left(x / x_{\max }\right)^{\alpha}} & {\text { if } x<x_{\max }} \\ {1} & {\text { otherwise }}\end{array}\right. f(x)={(x/xmax)α1 if x<xmax otherwise
根据实验发现 x m a x x_{max} xmax的值对结果的影响并不是很大,原作者采用了 x m a x = 100 x_{max}=100 xmax=100。而 α = 3 4 \alpha=\frac{3}{4} α=43时的结果要比 α = 1 \alpha=1 α=1时要更好。下面是 α = 1 \alpha=1 α=1时要更好。下面是 α = 3 4 \alpha=\frac{3}{4} α=43时 f ( x ) f(x) f(x)的函数图像,可以看出对于较小的 X i j X_{ij} Xij,权值也较小。这个函数图像如下所示:
【注意】
:对于任意一对
i
,
j
i, j
i,j,损失函数中存在以下两项之和
f
(
x
i
j
)
(
w
i
⊤
w
~
j
+
b
i
+
b
j
−
log
(
x
i
j
)
)
2
+
f
(
x
j
i
)
(
w
j
⊤
w
~
i
+
b
j
+
b
i
−
log
(
x
j
i
)
)
2
f\left(x_{i j}\right)\left(\mathbf{w}_{i}^{\top} \tilde{\mathbf{w}}_{j}+b_{i}+b_{j}-\log \left(x_{i j}\right)\right)^{2}+f\left(x_{j i}\right)\left(\mathbf{w}_{j}^{\top} \tilde{\mathbf{w}}_{i}+b_{j}+b_{i}-\log \left(x_{j i}\right)\right)^{2}
f(xij)(wi⊤w~j+bi+bj−log(xij))2+f(xji)(wj⊤w~i+bj+bi−log(xji))2
由于
x
i
j
=
x
j
i
x_{ij}=x_{ji}
xij=xji,对调
w
w
w和
w
~
\tilde{w}
w~并不改变损失函数中折=这两项之和的值。也就是说,在损失函数所有项上对调
w
w
w和
w
~
\tilde{w}
w~也不改变整个损失函数的值。因此,任意词的中心词向量和背景词向量是等价的。只是由于初始值的不同,同一个词最终学习到的两组词向量可能不同。当所有词向量学习得到后,Glove使用一个词的中心词向量与背景词向量之和作为该词的最终词向量。
Word2Vec和fastText对比有什么区别?
(1) 都可以无监督学习词向量,fastText训练词向量时会考虑subword;
(2) fastText还可以进行有监督学习进行文本分类,其主要特点:
- 结构与CBOW类似,但学习目标是人工标注的分类结果
- 采用hierarchical softmax(分层softmax)对输出的分类标签建立哈夫曼树,样本中标签多的类别被分配短的搜寻路径
- 引入N-gram,考虑词序特征
- 引入subword来处理长词,处理未登录词问题
(3) CBOW的输入是目标单词的上下文, fastText的输入是多个单词及其n-gram特征,这些特征用来表示单个文档。CBOW的输入单词被onehot编码过,fastText的输入特征是被embedding。CBOW的输出是目标词汇,fastText的输出是文档对应的类标。
fastText使用子词向量之和来表达整词
Word2Vec和Glove对比有什么区别?
- Word2Vec是局部语料库训练的,其特征提取是基于滑窗的;而glove的滑窗是为了构建co-occurance matrix,是基于全局语料的,可见glove需要事先统计共现概率;因此,Word2Vec可以进行在线学习,glove则需要统计固定语料信息。
- Word2Vec是无监督学习,同样由于不需要人工标注;glove通常被认为是无监督学习,但实际上glove还是有label的,即共现次数 l o g ( X i j ) log(X_{ij}) log(Xij)
- Word2Vec损失函数实质上是带权重的交叉熵,权重固定;glove的损失函数是最小平方损失函数,权重可以做映射变换。
- 总体来看,glove可以被看作是更换了目标函数和权重函数的全局Word2Vec
- Glove的词向量生成使用的是一个词的中心词和背景词的词向量之和作为该词的词向量,而word2vec只用中心词作为词向量
Word2Vec和LSA对比有什么区别?
- LSA主题模型和Word2Vec词嵌入两类方法最大的不同在于模型本身。
- 主题模型是一种基于概率图模型的生成式模型。其似然函数可以写为若干条件概率连乘的形式,其中包含需要推测的隐含变量(即主题)
- 词嵌入模型一般表示为神经网络的形式,似然函数定义在网络的输出之上。需要学习网络的权重来得到单词的稠密向量表示
Glove和LSA对比有什么区别?
LSA可以基于co-occurance matrix构建词向量,实质上是基于全局语料采用SVD进行矩阵分解,然而SVD计算复杂度高
glove可以看作对LSA一种优化的高效矩阵分解算法,采用Adagrad对最小平方损失进行优化。
并且对于LSA来说对所有单词的统计权重都是一致的,但是Glove的统计权重采用了一个衰减函数,在窗口中共现的单词,距离越远则权重越小。
word2vec和tf-idf 相似度计算时的区别?
Word2Vec相较于tf-idf有以下几个优点: 1. 稠密的、低维度的; 2. 表达出相似度; 3. 表达能力强; 4. 泛化能力强
word2vec和NNLM对比有什么区别?(word2vec vs NNLM)
(1) 本质上都可以看做是语言模型
(2) 词向量只不过是NNLM的一个产物,word2vec虽然本质上也是语言模型,但是其专注于词向量本身,因此做了许多优化来提高计算效率
- 与NNLM相比,CBOW模型输入时是将词向量直接求和, 而NNLM则是将它们拼接在一起, 并且CBOW模型舍弃了隐藏层
- 考虑到softmax归一化需要遍历整个词汇表,采用hierarchical softmax 和negative sampling进行优化,hierarchical softmax实质上生成一颗带权路径最小的哈夫曼树,让高频词搜索路径变小; negative sampling更为直接,实质上对每一个样本中每个词都进行负例采样,之后将其转换成二分类问题。
Attention
通用定义:给定一组向量集合values,以及一个向量query,attention机制是一种根据该query计算values的加权求和的机制。重点就是这个集合values中的每个value的“权值”的计算方法。 这种attention机制也叫做query的输出关注了原文的不同部分。
感性认识: attention机制就是一种根据某些规则或者某些额外信息(query)从向量表达集合(values)中抽取特定的向量进行加权组合(attention)的方法。简单来讲,只要我们从部分向量里面做了加权求和,那就算用了attention。
所谓的attention,就是在每个解码的时间步,对encoder的隐层状态进行加权求和,针对不同信息进行不同程度的注意力
为什么要引入Attention机制?
根据通用近似定理,前馈网络和循环网络都有很强的能力,但为什么还要引入注意力机制呢?
- ***计算能力的限制:***当要记住很多“信息”,模型就要变得更复杂,而然目前计算能力依然是限制神经网络发展的瓶颈。
- 优化算法的限制: 虽然局部连接、权重共享以及pooling等优化操作可以让神经网络变得简单一些,有效缓解模型复杂度和表达能力之间的矛盾;但是,如循环神经网络中的长距离问题,信息记忆能力并不高。
可以借助人脑处理信息过载的方式,例如Attention机制可以提高神经网络处理信息的能力
简单回答: Attention机制可以提高神经网络处理信息的能力,因为模型信息记忆能力是受限的,Attention能够帮助加强记忆重要的信息,而忽略掉不重要的信息,提高神经网络的效率。
Attention机制有哪些?(怎么分类)
当用神经网络来处理大量的输入信息时,也可以借鉴人脑的注意力机制,只选择一些关键的信息输入进行处理,来提高神经网络的效率。按照认知神经学的注意力,可以总体上分为两类:
- 聚焦式(focus)注意力 自上而下的有意识的注意力,主动注意——是指有预定目的、依赖任务的、主动有意识地聚焦于某一对象的注意力
- 显著性(saliency-based)注意力 自上而下的有意识的注意力,被动注意——基于显著性的注意力是由外界刺激驱动的注意,不需要主动干预,也和任务无关;可以将max-pooling和门控机制来近似地看作是自下而上的基于显著性的注意力机制。
在神经网络中,注意力机制一般就特指聚焦式注意力。
Attention 机制的计算流程是怎样的?
Attention机制的实质其实就是一个寻址的过程,如上图所示:给定一个和任务相关的查询Query向量q,通过计算与Key的注意力分布并附加在Value上,从而计算Attention Value,这个过程实际上是Attention机制缓解神经网络模型复杂度的体现:不需要将所有的N个输入信息都输入到神经网络进行计算,只需要从X中选择一些和任务相关的信息输入给神经网络。
- 注意力机制可以分为三步: 一是信息输入; 二是计算注意力分布 α \alpha α; 三是根据注意力分布 α \alpha α来计算输入信息的加权平均
- Step-1信息输入: 用 X = [ x 1 , ⋯ , x N ] X=[x_1, \cdots, x_N] X=[x1,⋯,xN]表示N个输入信息
- Step-2注意力分布计算: 令Key=Value=X,则可以给出注意力分布
α i = s o f t m a x ( s ( k e y i , q ) ) = s o f t m a x ( s ( X i , q ) ) \alpha_i=softmax(s(key_i, q))=softmax(s(X_i, q)) αi=softmax(s(keyi,q))=softmax(s(Xi,q))
我们将 α i \alpha_i αi称之为注意力分布(概率分布), s ( X i , q ) s(X_i, q) s(Xi,q)为注意力打分机制,有几种打分机制:
- Step-3信息加权平均: 注意力分布
α
i
\alpha_i
αi可以解释为在上下文查询
q
q
q时,第
i
i
i个信息受关注的程度,采用一种“软性”的信息选择机制对输入信息
X
X
X进行编码为
a
t
t
(
q
,
X
)
=
∑
i
=
1
N
α
i
X
i
att(q,X)=\sum_{i=1}^{N}\alpha_iX_i
att(q,X)=i=1∑NαiXi
这种编码方式为软性注意力机制(soft Attention),软注意力机制有两种:普通模式( K e y = V a l u e = X Key=Value=X Key=Value=X)和键值对模式( K e y ! = V a l u e Key!=Value Key!=Value)
Attention机制的变种有哪些?
Attention的变种: https://blog.csdn.net/jinyuan7708/article/details/85140849
与普通的Attention机制(上图左)相比,Attention机制有哪些变种呢?
- 变种1-硬性注意力: 之前提到的注意力是软性注意力,其选择的信息是所有输入信息在注意力分布下的期望。还有一种注意力是只关注到某一个位置上的信息,叫做硬性注意力(hard Attention)。硬性注意力 有两种实现方式:(1)一种是选取最该概率的输入信息;(2)另一种硬性注意力可以通过在注意力分布式上随机采样的方式实现。硬性注意力模型的缺点:
硬性注意力的一个缺点是基于最大采样或随机采样的方式来选择信息。因此最终的损失函数与注意力分布之间的函数关系不可导,因此无法使用在反向传播算法进行训练。为了使用反向传播算法,一般使用软性注意力来代替硬性注意力。硬性注意力需要通过强化学习来进行训练。
-
**变种2-键值对注意力:**即上图右边的键值对模式,此时Key!=Value,注意力函数变为:
a t t ( ( K , V ) , q ) = ∑ i = 1 N α i v i = ∑ i = 1 N e x p ( s ( k i , q ) ) ∑ j e x p ( s ( k j , q ) ) v i att((K, V), q)=\sum_{i=1}^N\alpha_iv_i = \sum_{i=1}^N\frac{exp(s(k_i,q))}{\sum_jexp(s(k_j,q))}v_i att((K,V),q)=i=1∑Nαivi=i=1∑N∑jexp(s(kj,q))exp(s(ki,q))vi -
**变种3-多头注意力:**多头注意力(multi-head attention)是利用多个查询 Q = [ q 1 , ⋯ , q M ] Q=[q_1,\cdots,q_M] Q=[q1,⋯,qM],来平行地计算从输入信息中选取多个信息。每个注意力关注输入信息的不同部分,然后再进行拼接:
att ( ( K , V ) , Q ) = att ( ( K , V ) , q 1 ) ⊕ ⋯ ⊕ att ( ( K , V ) , q M ) \operatorname{att}((K, V), Q)=\operatorname{att}\left((K, V), \mathbf{q}_{1}\right) \oplus \cdots \oplus \operatorname{att}\left((K, V), \mathbf{q}_{M}\right) att((K,V),Q)=att((K,V),q1)⊕⋯⊕att((K,V),qM)
一种强大的Attention机制:为什么自注意力模型(self-Attention model)在长距离序列中如此强大?
(1)卷积或循环神经网络难道不能处理长距离序列吗?
当使用神经网络来处理一个变长的向量序列时,我们通常可以使用卷积网络或循环网络进行编码来得到一个相同长度的输出向量序列,如图所示:
从上图可以看出,无论卷积还是循环神经网络其实都是对变长序列的一种“局部编码”:卷积神经网络显然是基于N-gram的局部编码;而对于循环神经网络,由于梯度消失等问题也只能建立短距离依赖。
(2)要解决这种短距离依赖的“局部编码”问题,从而对输入序列建立长距离依赖关系,有哪些办法呢?
如果要建立输入序列之间的长距离依赖关系,可以使用以下两种方法:一 种方法是增加网络的层数,通过一个深层网络来获取远距离的信息交互,另一种方法是使用全连接网络。
由上图可以看出,全连接网络虽然是一种非常直接的建模远距离依赖的模型, 但是无法处理变长的输入序列。不同的输入长度,其连接权重的大小也是不同的。
这时我们就可以利用注意力机制来“动态”地生成不同连接的权重,这就是自注意力模型(self-attention model)。由于自注意力模型的权重是动态生成的,因此可以处理变长的信息序列。
总体来说,为什么自注意力模型(self-Attention model)如此强大:利用注意力机制来“动态”地生成不同连接的权重,从而处理变长的信息序列。
3)自注意力模型(self-Attention model)具体的计算流程是怎样的呢?
- 第一步: 从每个编码器的输入向量(每个单词的词向量)中生成三个向量, 一个查询向量、一个键向量和一个值向量,这三个向量通过词嵌入与三个权重矩阵相乘创建。由于使用了多头,因此三种向量的维度是比词嵌入向量低的
- 第二步: 计算得分。 这些分数是通过打分单词(所有输入句子的单词)的键向量K与查询向量Q点积计算的。
- 第三步: 将分数除以键向量K维数的平方根,目的是为了让梯度更稳定。
- 第四步: softmax传送结果。 softmax的作用是使所有单词的分数归一化,得到的分数都是正值且和为1.
- 第五步: 每个值向量V乘以对应的softmax分数。 目的是希望关注语义上相关的单词,弱化不相关的单词
- 第六步: 对加权值向量求和。
自注意机制的一种解释就是在编码某个单词时,就是将所有单词的表示(值向量)进行加权求和,而权重是通过该单词的表示(键向量)与被编码词表示(查询向量)的点积并通过softmax得到
同样,给出信息输入:用
X
=
[
x
1
,
⋯
,
x
N
]
X = [x_1, \cdots , x_N ]
X=[x1,⋯,xN]表示N 个输入信息;通过线性变换得到为查询向量序列,键向量序列和值向量序列:
Q
=
W
Q
X
K
=
W
K
X
V
=
W
V
X
Q = W_QX \qquad K = W_KX \qquad V= W_VX
Q=WQXK=WKXV=WVX
上面的公式可以看出,self-Attention中的Q是对自身(self)输入的变换,而在传统的Attention中,Q来自于外部。
注意力计算公式为:
KaTeX parse error: Can't use function '$' in math mode at position 22: …att((K,V), q_t)$̲ = \sum_{j=1}^{…
自注意力模型(self-Attention model)中,通常使用缩放点积来作为注意力打分函数,输出向量序列可以写为:
H
=
s
o
f
t
m
a
x
(
Q
K
T
d
k
)
V
H = softmax(\frac{Q K^T}{\sqrt{d_k}})V
H=softmax(dkQKT)V
Attention Mechanism的优缺点
优点
- 在输出序列与输入序列顺序不同的情况下表现较好,如翻译、阅读理解,相比RNN可以编码更长的序列信息
- self-attention可以比rnn更好地解决长时间依赖问题,如果计算量太大,比如序列长度n>序列维度d这种情况,也可以用窗口限制self-attention的计算数量
- self-attention模型更可解释,attention结果的分布表明了该模型学习到了一些语法和语义信息
- Attention机制的并行化,适合并行处理
- Position Embedding,将位置信息也放到词向量中配合self-attention机制的使用
- 能够一步到位捕捉到全局的联系,因为它直接把序列两两比较(代价是计算量变为 O ( n 2 ) O(n^2) O(n2),由于是纯矩阵运算,这个运算量也还好),相比之下,RNN需要一步步递推才能捕捉到,而CNN需要通过层叠来扩大感受野,这是Attention层的明显优势
缺点
- 无法对位置信息进行很好地建模。尽管引入了Position Embedding,但是这个只是缓解方案,并不能解决根本问题
- 并非所有问题都需要长程的、全局的依赖,也有很多问题只依赖于局部结构,此时纯Attention就不会很好。Google也意识到这个问题,因此可以假设当前词只与前后r个词发声练习,因此注意力也值发生在这2r+1个词之间,这样就能减小计算量,也能捕捉到序列的局部结构
Transformer(Attention Is All You Need)详解
Transformer学习参考:https://mp.weixin.qq.com/s/QeUh44tV9KzsmF-j13-zqA
推荐: https://blog.csdn.net/longxinchen_ml/article/details/86533005
代码学习: http://nlp.seas.harvard.edu/2018/04/03/attention.html
中文代码学习: https://juejin.im/post/5b9f1af0e51d450e425eb32d#comment
Transformer的整体架构是怎样的?由哪些部分组成?
Transformer其实这就是一个Seq2Seq模型,左边一个encoder把输入读进去,右边一个decoder得到输出:
Transformer=Transformer Encoder+Transformer Decoder
(1)Transformer Encoder(N=6层,每层包括2个sub-layers):
sub-layer-1:multi-head self-attention mechanism,用来进行self-attention。
sub-layer-2:Position-wise Feed-forward Networks,简单的全连接网络,对每个position的向量分别进行相同的操作,包括两个线性变换和一个ReLU激活输出(输入输出层的维度都为512,中间层为2048):
F
F
N
(
x
)
=
m
a
x
(
0
,
x
W
1
+
b
1
)
W
2
+
b
2
FFN(x)=max(0, xW_1 + b_1)W_2 + b_2
FFN(x)=max(0,xW1+b1)W2+b2
每个sub-layer都使用了残差网络:
L
a
y
e
r
N
o
r
m
(
X
+
s
u
b
l
a
y
e
r
(
X
)
)
LayerNorm(X+sublayer(X))
LayerNorm(X+sublayer(X))
(2)Transformer Decoder(N=6层,每层包括3个sub-layers):
sub-layer-1:Masked multi-head self-attention mechanism,用来进行self-attention,与Encoder不同:由于是序列生成过程,所以在时刻 i 的时候,大于 i 的时刻都没有结果,只有小于 i 的时刻有结果,因此需要做Mask。
sub-layer-2:Position-wise Feed-forward Networks,同Encoder。
sub-layer-3:Encoder-Decoder attention计算。“编码—解码注意力层”可以帮助解码器关注到输入序列中对当前解码词的有作用的词。
Transformer上的并行
对于输入序列中的每个位置的单词都有自己独特的路径流入编码器,这些路径之间存在依赖关系。而前馈(feed-forward)层没有这些依赖关系。因此在前馈(feed-forward)层时可以并行执行各种路径。
多头注意力中“多头”的作用
- 扩展了模型专注于不同位置的能力。因为在编码时,单词更有可能是被单词本身所支配。通过多头能够帮助单词更容易捕获与其他单词的关联。
- 它给出了注意力层的多个“表示子空间”。 多头注意力机制,每个词就会有多个Q/K/V权重矩阵集,因为这些集合每个都是随机初始化的,因此每个集合都被用来将输入词嵌入投影到不同的表示子空间中
Transformer Encoder 与 Transformer Decoder 有哪些不同?
(1)multi-head self-attention mechanism不同,Encoder中不需要使用序列Masked,而Decoder中需要使用序列Masked;
(2)Decoder中多了一层Encoder-Decoder attention,这与 self-attention mechanism不同。
Encoder-Decoder attention 与self-attention mechanism有哪些不同?
它们都是用了 multi-head计算,不过Encoder-Decoder attention采用传统的attention机制,其中的Query是self-attention mechanism已经计算出的上一时间i处的编码值,Key和Value都是Encoder的输出,这与self-attention mechanism不同。
multi-head self-attention mechanism具体的计算过程是怎样的?
Transformer中的Attention机制由Scaled Dot-Product Attention和Multi-Head Attention组成。下面具体介绍各个环节:
**Expand:**实际上是经过线性变换,生成Q、K、V三个向量;
Split heads: 进行分头操作,在原文中将原来每个位置512维度分成8个head,每个head维度变为64;
**Self Attention:**对每个head进行Self Attention;
**Concat heads:**对进行完Self Attention每个head进行拼接;
上述过程公式为:
M
u
l
t
i
H
e
a
d
(
Q
,
K
,
V
)
=
C
o
n
c
a
t
(
h
e
a
d
1
,
⋯
,
h
e
a
d
h
)
W
O
w
h
e
r
e
h
e
a
d
i
=
A
t
t
e
n
t
i
o
n
(
Q
W
i
Q
,
K
W
i
K
,
V
W
i
V
)
MultiHead(Q,K,V) = Concat(head_1, \cdots, head_h)W^O \qquad where \ \ head_i=Attention(QW_i^Q, KW_i^K, VW_i^V)
MultiHead(Q,K,V)=Concat(head1,⋯,headh)WOwhere headi=Attention(QWiQ,KWiK,VWiV)
Transformer在GPT和Bert等词向量预训练模型中具体是怎么应用的?有什么变化?
GPT中训练的是单向语言模型,其实就是应用Transformer Decoder,将其中的多头上下文注意力机制那一层去掉了;
Bert中训练的是双向语言模型,应用了Transformer Encoder部分,不过在Encoder基础上还做了Masked操作;
BERT Transformer 使用双向self-attention,而GPT Transformer 使用受限制的self-attention,其中每个token只能处理其左侧的上下文。双向 Transformer 通常被称为“Transformer encoder”,而左侧上下文被称为“Transformer decoder”,decoder是不能获要预测的信息的。
BERT
BERT学习参考: https://www.jianshu.com/p/4dbdb5ab959b
bert的全称是Bidirectional Encoder Representation from Transformers,bert的核心是双向Transformer Encoder
BERT输入有三种嵌入输入
一是Token Embedding,这个是词的向量,但在BERT中这个向量应该是字向量,并且是随机初始化的,比如词典中是1W个字,BERT将每个token随机初始化为1W的向量。在训练过程中进行调整
二是Segment Embedding,这个输入向量其实就是用来标记的,标记当前词属于哪句话,看图中Segment Embedding的输入取值只有
E
A
,
E
B
E_A, E_B
EA,EB,表明句子中的词属于其中的某一句话的
三是Position Embedding,这个是位置向量,用该向量来保证时序信号。Transformer中的Position Embedding是由公式直接给出,而BERT中的Position Embedding是一个可训练的值
为什么bert采取的是双向Transformer Encoder,而不叫decoder?
因为BERT使用的是Transformer中的Encoder部分,使用了双向self-attention, 而GPT 使用的是Transformer的Decoder部分,是受限的self-attention,其中每个token只能处理左侧的上下文。
elmo、GPT和bert在单双向语言模型处理上的不同之处?
Elmo是基于特征的方法, GPT和BERT都是基于微调的方法。
Elmo模型使用的是将一个从左到右的LSTM模型和一个从右到左的LSTM模型拼接起来
GPT使用的是Transformer的decoder部分,因此它只能依赖上文
BERT使用的是Transformer的encode部分,共同依赖于左右上下文
(1) 特征提取器: Elmo采用LSTM进行提取,GPT和bert则采用Transformer进行提取。很多任务表明Transformer特征提取能力强于LSTM,elmo采用1层静态词向量+2层LSTM,多层提取能力有限,而GPT和bert中的Transformer可采用多层,并行计算能力强。
(2)单/双向语言模型:
- GPT采用单向语言模型,elmo和bert采用双向语言模型。但是elmo实际上是两个单向语言模型(方向相反)的拼接,这种融合特征的能力比bert一体化融合特征方式弱。
- GPT和bert都采用Transformer,Transformer是encoder-decoder结构,GPT的单向语言模型采用decoder部分,decoder的部分见到的都是不完整的句子;bert的双向语言模型则采用encoder部分,采用了完整句子。
知识点补充: 现有的两种方法可以将预训练好的语言模型表示应用到下游任务中:基于特征的和微调。基于特征的方法,如 ELMo,使用特定于任务的模型结构,其中包含预训练的表示作为附加特特征。微调方法,如生成预训练 GPT模型,然后引入最小的特定于任务的参数,并通过简单地微调预训练模型的参数对下游任务进行训练。在之前的工作中,两种方法在预训练任务中都具有相同的目标函数,即使用单向的语言模型来学习通用的语言表达。
bert构建双向语言模型不是很简单吗?可以直接像elmo拼接Transformer decoder吗?
BERT的作者认为,这种拼接式的双向编码仍然不能完整地理解整个语句的语义 。 更好的办法是用上下文全向来预测[mask],也就是用“能实现语言表征的模型”来预测[mask]。BERT作者把上下文全向的预测方法,称之为 deep bi-directional。
bert为什么要采取Marked LM,而不直接应用Transformer Encoder?
使用这边语言模型实现预训练深层双向表示
我们知道向Transformer这样深度越深,学习效果会越好。可是为什么不直接应用双向模型呢?因为随着网络深度增加会导致标签泄露。如下图:
深度双向模型比left-to-right模型或left-to-right和right-to-left模型的浅层连接更强大。遗憾的是,标准条件语言模型只能从左到右或从右到左进行训练,因为双向条件作用将允许每个单词在多层上下文中间接"see itself"。
为了训练一个深度双向表示(deep bidirectional representation),研究团队采用了一种简单的方法,即随机屏蔽(masking)部分输入token,然后只预测那些被屏蔽的token。论文将这个过程称为“masked LM”(MLM)。
bert为什么并不总是用实际的[MASK]token替换被“masked”的词汇?
这种方法有两个缺点:
-
预训练和finetuning之间不匹配,因为finetuning期间从未看到被“masked”的词汇。
训练数据生成器随机选择15%的token,然后执行以下操作,而不是始终使用[mask]替换所选单词
80%的时间:用[MASK]标记替换单词,例如,my dog is hairy → my dog is [MASK]
10%的时间:用一个随机的单词替换该单词,例如,my dog is hairy → my dog is apple
10%的时间:保持单词不变,例如,my dog is hairy → my dog is hairy. 这样做的目的是将表示偏向于实际观察到的单词。
Transformer encoder不知道它将被要求预测哪些单词或哪些单词已被随机单词替换,因此它被迫保持每个输入token的分布式上下文表示。此外,因为随机替换只发生在所有token的1.5%(即15%的10%),这似乎不会损害模型的语言理解能力。 -
每个batch只预测15%的token,这表明可能需要更多的预训练步骤才能收敛。团队证明MLM(Mask LM)的收敛速度略慢于left-to-right模型(预测每个token),但是MLM模型在实验上获得的提升远远超过增加的训练成本。
BERT的创新点
bert模型的主要创新点都在pre-train方法上,即用了Masked LM和Next Sentence Prediction两种方法分别捕捉词语和句子级别的representation。
整个模型的Loss由语言模型的loss和二分类的loss,加起来进行优化。
在self-attention中其实是插了一个dropout的,源码中就有,很奇怪
下一句预测
如问答和自然语言理解,都是建立在理解两个文本句子之间的关系的基础上的,语言模型是无法直接捕捉到的,因此为了训练一个理解句子关系的模型,预训练一个下一句预测的二分类任务。
BERT不同任务
阅读理解任务
Tagging任务
BERT的一些细节
-
预训练数据的构建
输入的两部分都是包含完整句子: 两个句子拼接都是两个完整的句子,而不是进行切分过的
同一句中不会同时Mask同一个词:一句话中一个词不会被mask两次,比如助动词的出现两次,只会mask其中一个
非连续的句子都是取自不同文档
有一定的概率让输入的有效文本长度小于输入全长(利用padding补齐), 全长512个token
对于超过全长的文本,随机从第一部分和第二部分的头和尾进行削减 -
模型
Encoder LM任务的输出后经过一个gelu非线性层再进行LM Loss的计算
Classify任务的输出后经过一个tanh非线性层再进行的二分类