赞
踩
本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经验分享,旨在帮助读者更好地理解和应用这些领域的最新进展
在实际系统我们会接触到许许多多的文本类型数据。如何将这部分数据用于作为机器学习模型的输入呢?一个常用的方法是将文本转化为一个能很好的表示它的向量,这里将称该向量称作为文本向量。本文将以尽可能少的数学公式介绍目前业界比较流行的基于神经网络进行文本特征提取,得到文本向量的方案。
这部分内容将介绍线性回归、梯度下降、神经网络、反向传播。对于有基础的同学这部分可以跳过,对于之前没有接触过相关知识点的同学,我会用尽可能少的公式去介绍。希望能讲明白 ==
其实线性回归模型很简单,它类似于我们中学学的多元一次方程的形式,如:
y
^
=
w
1
x
1
+
w
2
x
2
+
w
3
x
3
+
b
\large \hat{y} = w_1x_1 + w_2x_2 + w_3x_3+b
y^=w1x1+w2x2+w3x3+b
其中
y
^
\hat{y}
y^是我们要预测的值。
x
x
x是我们的输入的特征,举例来说,我们要预测房价(
y
^
\hat{y}
y^),我们输入的特征有该房子面积(
x
1
x_1
x1)、有该房子室数(
x
2
x_2
x2)、有该房子地域热度(
x
3
x_3
x3)。我们知道历史数据中的
x
x
x和其对应的真实房价
y
y
y,而线性回归模型任务就是要找到最佳的参数
W
W
W和
b
b
b,使得预测值
y
^
\hat{y}
y^和真实值
y
y
y最相近。
哪我们如何找到最佳的参数
W
W
W和
b
b
b呢?业界最流行的方法就是使用梯度下降。
这里为了让问题更加简单形象,我们暂时把模型简化$ \hat{y} = wx+b
。想让预测值
。想让预测值
。想让预测值\hat{y}
和真实值
和真实值
和真实值y$最相近,首先我可以使用它们之间的平方误差来度量:
J
(
w
,
b
)
=
(
y
^
−
y
)
2
\large J(w,b)=(\hat{y}-y)^2
J(w,b)=(y^−y)2
梯度下降法的形象化说明:
在这个碗形图中,横轴表示参数
W
W
W和
b
b
b,在实践中,可以是更高的维度。
如图那个小红点,采用随机初始化的方法初始化的参数
W
W
W和
b
b
b:
我们的目标是将它下落到碗形图的最底部,即
m
i
n
(
J
(
w
,
b
)
)
min(J(w,b))
min(J(w,b)):
那红点会怎么下落呢?回想下中学学的物理就很形象了,我们先只看 w w w轴。没错,沿着斜率方向下降,红点会快的接近碗底。
当然,如何一直沿着最初的斜率方向走是不能到达碗底的,而应该一小步一小步的走,每走一步调整方向为当前的斜率方向:
对于 b b b轴也类似,那么红点就会如下图一步一步的下降:
于是每一步我们更新参数为:
其中
α
\alpha
α 为每一步的步长。
这样不断的迭代,不断的下降,参数
W
W
W和
b
b
b的取值就不断的被优化了。
我们先来介绍单个神经元的模型结构,如下图:
其实这个和我们上文讲的的线性回归模型非常相似。
x
1
x_1
x1、
x
2
x_2
x2、
x
3
x_3
x3就是线性回归模型的特征输入,箭头边可以看做就是线性回归模型权重参数
w
1
w_1
w1、
w
2
w_2
w2、
w
3
w_3
w3,每个输入经过箭头都会乘以相应边上的权重。图中的圆圈就是所谓的神经元,经过箭头进入神经元的元素会被相加,然后在加上一个偏置参数
b
b
b,即上文的
w
1
x
1
+
w
2
x
2
+
w
3
x
3
+
b
w_1x_1 + w_2x_2 + w_3x_3+b
w1x1+w2x2+w3x3+b,最后输出预测值
y
^
\hat{y}
y^。
唯一不同的是神经元里面还可以存在激活函数,如果神经元没激活函数,那么就和上文讲的线性回归模型基本上一模一样。常见的激活函数有:
这里的
z
z
z就是神经元的输入,如我们这里的
w
1
x
1
+
w
2
x
2
+
w
3
x
3
+
b
w_1x_1 + w_2x_2 + w_3x_3+b
w1x1+w2x2+w3x3+b。
为什么需要有这么多激活函数呢?激活函数是为了让神经网络具有非线性的拟合能力。其实激活函数的选择也还在不断演进,是学术界热门研究方向,我们也可以自己创造激活函数。激活函数适用也不同,如ReLU函数能有效的预防梯度消失问题,而sigmoid函数能讲回归问题转化为二分类问题。
理解了基础的神经元模型,神经网络就很好理解了。神经元就像一块乐高积木,而神经网络就是搭的积木。
如上图,
x
x
x那一列,我们称为输入层,输出
y
^
\hat{y}
y^那列称为输出层,中间那列称为隐藏层。隐藏层可以有多个,而且每个隐藏层有多少个神经元也都是可以自主调整的。经典的神经网络中,当前层的神经元会后后一层的各个神经元进行连接,这也称为全连接。
上图是形象化的神经网络模型结构图,那实际上模型的特征输入到预测输出,在数学上、在内存里是怎么实现的呢?这里我们来介绍下从输入层到第一个隐藏层的向前传播的过程。
首先,输入的特征向量(数组):
x
(
1
)
=
[
x
1
x
2
x
3
]
x^{(1)} = \left[
它会与权重矩阵(二维数组)相乘
[
x
1
x
2
x
3
]
∗
[
w
11
w
12
w
13
w
14
w
21
w
22
w
23
w
24
w
31
w
32
w
33
w
34
]
\left[
=
[
x
1
w
11
+
x
2
w
21
+
x
3
w
31
x
1
w
12
+
x
2
w
22
+
x
3
w
32
x
1
w
13
+
x
2
w
23
+
x
3
w
33
x
1
w
14
+
x
2
w
24
+
x
3
w
34
]
T
= \left[
加上偏置向量(数组):
[
x
1
w
11
+
x
2
w
21
+
x
3
w
31
x
1
w
12
+
x
2
w
22
+
x
3
w
32
x
1
w
13
+
x
2
w
23
+
x
3
w
33
x
1
w
14
+
x
2
w
24
+
x
3
w
34
]
T
+
[
b
1
b
2
b
3
b
4
]
T
\left[
=
[
x
1
w
11
+
x
2
w
21
+
x
3
w
31
+
b
1
x
1
w
12
+
x
2
w
22
+
x
3
w
32
+
b
2
x
1
w
13
+
x
2
w
23
+
x
3
w
33
+
b
3
x
1
w
14
+
x
2
w
24
+
x
3
w
34
+
b
4
]
T
= \left[
最后送入激活函数,如tanh函数:
[
t
a
n
h
(
x
1
w
11
+
x
2
w
21
+
x
3
w
31
+
b
1
)
t
a
n
h
(
x
1
w
12
+
x
2
w
22
+
x
3
w
32
+
b
2
)
t
a
n
h
(
x
1
w
13
+
x
2
w
23
+
x
3
w
33
+
b
3
)
t
a
n
h
(
x
1
w
14
+
x
2
w
24
+
x
3
w
34
+
b
4
)
]
T
=
x
(
2
)
T
\left[
神经网络这么多参数该如何优化呢?其实和上文说的一样,我们还是使用梯度下降的方法。最后一层的权重调整我们可以与梯度下降的方法求出。最后第二层我们可以基于最后一层的权重调整,利用链式求导的方式求出。就这样从后往前的调整,这就是所谓的反向传播。
#2. 词汇特征表示
完成我们的背景知识回顾学习之后,就进入我们正式要讲解的内容了。
这里我们先介绍一个概念——语言模型。简单来讲,语言模型就是一个想让机器学会说话的模型。它会基于给定的上文,预测出最有可能的下文。比如说,“I want a glass of orange ____ ”,输入前文,模型将预测出空格可能的单词为“juice”。
现在我们有一个词典,如:【a,apple,…,zoo,】,其中代表未知单词。假设我们的词典里里面一个有10000个单词,那如何用生成某个词汇特征表示呢?一个很容易想到的方法就是one-hot:用一个10000维的向量来表示一个词语。
但是这种方法有两个致命缺点:
为了解决上述缺点,我们可以手工的做词嵌入:
Topic | Man | Woman | King | Queen | Apple | Orange |
---|---|---|---|---|---|---|
Gender | -1 | 1 | -0.95 | 0.97 | 0.00 | 0.01 |
Royal | 0.01 | 0.02 | 0.93 | 0.95 | -0.01 | 0.00 |
Age | 0.03 | 0.02 | 0.7 | 0.69 | 0.03 | -0.02 |
Food | 0.09 | 0.01 | 0.02 | 0.01 | 0.95 | 0.97 |
… | … | … | … | … | … | … |
我们选取几个Topic,每行是各个单词关于该Topic的相关系数。这样一来,我们可以看到向量的维度大小得到了控制,而且词与词有明显的关系。我们还能惊喜的发现King的向量减去Man的向量,再加上Woman的向量,就约等于Queen的向量! |
词嵌入固然好,但手工的为10000个词语关于各个Topic打相关系数 ,这需要耗费巨大的人力,而且要求非常深厚的语言词汇知识。
Google大神们提出了目前非常流行的训练词向量的算法——
w
o
r
d
2
v
e
c
t
o
r
[
1
]
word2vector^{[1]}
word2vector[1]。我们先来看看word2vector强大的的效果吧:
上表是783M的单词,训练出的300维度的词向量,得到的对应关系。比如,使用
v
P
a
r
i
s
−
v
F
r
a
n
c
e
+
v
I
t
a
l
y
v_{Paris} - v_{France} + v_{Italy}
vParis−vFrance+vItaly得到的向量
v
1
v_1
v1,在字典里查询与它最相似的是向量
v
R
o
m
e
v_{Rome}
vRome(可以用cos相似度进行度量)。
再讲word2vector之前,我们先来讲讲另外一种模型——基于神经网络语言模型
[
2
]
^{[2]}
[2]。其实Google大佬在论文【1】中也实验了用该模型生成词向量,word2vector算法也就是在这个基础上进行的变形、优化。模型结构如下:
这么一来,我们就可以使用反向传播与梯度下降优化调整网络中的参数,同时也就调整生成了共享矩阵 C C C,即我们的词向量矩阵。
其实理解了基于神经网络语言模型的词向量生成模型,word2vector模型就非常好理解了。word2vector有两种形式——CBOW 和 Skip-gram。
不同于神经网络语言模型去上文的单词作为输入,CBOW模型获得中间词两边的的上下文,然后用周围的词去预测中间的词。
与神经网络语言模型还有点不同的是:经过词嵌入后,CBOW模型不是将向量合并,而是将向量按位素数相加。
Skip-gram模型正好和CBOW模型相反,输入为中间的词,使用预测两边的的上下文的单词。
从上文我们可以看到,最后的输出层有10000个节点,显然这部分需要消耗非常大的计算资源。这里介绍两种加速的方法:
现在我们有了词向量,那对于一个文本,如何用一个向量来表示它呢?
Facebook的大牛们基于word2vector词向量设计了fastText文本分类模型
[
3
]
^{[3]}
[3]。其实它的结构也很简单,就是将各个词向量相加,作为其文本的向量表示:
除此之外, fastText还添加了N-gram特征,这里就不再介绍,感兴趣的同学可见【3】
fastText是目前非常流行的文本分类的模型,但是直接将各个词向量相加存在一个很大的缺点,就是消除了词序的特征。如“mother loves dad”和“dad loves mother”,在这种文本特征生成方案下,它们的文本向量就一模一样了。
Google的大牛们基于word2vector模型也设计出了文本向量生成的方案。该方案的核心思想就是:将文档看做一个特殊的单词。该方案有两种形式——分布记忆模型和分布词包模型
[
4
]
^{[4]}
[4]。
分布记忆模型将文档id看做一个特殊的单词,设窗口大小为3,那么输入的特征为文档id和该文本的三个单词(按顺序),Label则是下一个单词。不断迭代,直到窗口移动到文末。所有文档训练结束后,文档id所对应的词向量就是该文档的文本向量。该方案保留了词语间的词序信息:
分布词包模型也将文档id看做一个特殊的单词,不同的是,它套用了Skip-gram的结构。该方案不保留了词语间的词序信息:
最近深度学习非常热门,输入词向量特征,基于深度学习模型也可以进行文本的特征学习:
但这部分超出了本文所要介绍文本向量的范围,具体可以参阅《阅读笔记1》与《阅读笔记2》
无论是文本分布表示还是上深度学习模型,对于在线实时预测的机器学习系统都有较大的性能挑战。今年最新提出的简单词嵌入模型(SWEM)关注到了这个问题,论文提出了更加简单轻量的文本向量生成方案 [ 7 ] ^{[7]} [7]:
论文将SWEM方案生成文本向量,输入到神经网络分类器:隐藏层[100, 300, 500, 1000]与一个softmax输出层。论文将它和其他模型在不同数据集上进行了文本分类预测正确率的对比:
可见,SWEM-concat 和 SWEM-hier 表现非常的优秀,甚至超过了复杂的深度学习模型。
【1】Mikolov, T., Chen, K., Corrado, G., & Dean, J. (2013). Efficient estimation of word representations in vector space. Computer Science.
【2】Bengio, Yoshua, et al. A neural probabilistic language model… Innovations in Machine Learning. Springer Berlin Heidelberg, 2006:137-186.
【3】Joulin A, Grave E, Bojanowski P, et al. Bag of Tricks for Efficient Text Classification[J]. 2016:427-431.
【4】Le Q, Mikolov T. Distributed representations of sentences and documents[C] International Conference on International Conference on Machine Learning. JMLR.org, 2014:II-1188.
【5】Kim Y. Convolutional Neural Networks for Sentence Classification[J]. Eprint Arxiv, 2014.
【6】Vinyals O, Le Q. A Neural Conversational Model[J]. Computer Science, 2015.
【7】Shen D, Wang G, Wang W, et al. Baseline Needs More Love: On Simple Word-Embedding-Based Models and Associated Pooling Mechanisms[J]. 2018.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。