标准神经网络怎么处理词向量
词向量输入到标注神经网络
好的,我来通过一个具体的例子,详细说明如何将多个词向量堆叠成矩阵,或者通过池化或取平均的方法,将其转换为一个固定长度的向量,然后输入到标准的前馈神经网络中。
假设我们有一个句子:
"I love cats"
这个句子包含三个单词:"I"、"love" 和 "cats"。
假设我们使用的词向量维度为 4(为了简单起见,实际中词向量维度通常为100-300)。我们有以下词向量:
- I 的词向量:
[0.1, 0.2, 0.3, 0.4]
- love 的词向量:
[0.5, 0.6, 0.7, 0.8]
- cats 的词向量:
[0.9, 1.0, 1.1, 1.2]
方法一:堆叠词向量成矩阵
步骤
-
词向量表示
将每个单词转换为对应的词向量,如上所示。
-
堆叠成矩阵
将三个词向量按顺序堆叠成一个矩阵。矩阵的形状为 (3, 4),即3个单词,每个词向量有4个维度。
[ [0.1, 0.2, 0.3, 0.4], // "I" [0.5, 0.6, 0.7, 0.8], // "love" [0.9, 1.0, 1.1, 1.2] // "cats" ]
-
将矩阵展开为向量
为了输入到标准的前馈神经网络(通常需要一维向量),将矩阵展平成一个一维向量。可以使用flatten操作,将矩阵按行或按列展开:
-
按行展开(Row-major order):
[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2]
这个向量的长度为 12(3个单词 * 4个维度)。
-
-
输入到神经网络
将这个长度为12的向量作为输入层,传递给前馈神经网络。
神经网络结构
- 输入层:12个神经元,对应展开后的向量的每个元素。
- 隐藏层:可以设置一个或多个隐藏层,例如包含8个神经元的隐藏层。
- 输出层:根据任务需求,例如二分类任务,可以使用一个神经元加上Sigmoid激活函数。
示意图
输入层 (12个节点) --> 隐藏层 (8个节点) --> 输出层 (1个节点)
方法二:池化或取平均
步骤
-
词向量表示
同样地,将每个单词转换为对应的词向量。
-
池化操作
对于每个维度,对所有词向量的对应维度进行池化操作,例如取平均或取最大值。
-
取平均值(Average Pooling)
对于每个维度 \(d_i\)( i = 1, 2, 3, 4 ),计算:
\(\text{平均值}_i = \frac{1}{N} \sum_{j=1}^{N} x_{j,i}\)
其中 ( N = 3 )(词的数量),$ x_{j,i} $ 表示第 ( j ) 个词的第 ( i ) 个维度的值。
具体计算:
第1维:
\(\text{平均值}_1 = \frac{0.1 + 0.5 + 0.9}{3} = \frac{1.5}{3} = 0.5\)第2维:
\(\text{平均值}_2 = \frac{0.2 + 0.6 + 1.0}{3} = \frac{1.8}{3} = 0.6\)
第3维:
\(\text{平均值}_3 = \frac{0.3 + 0.7 + 1.1}{3} = \frac{2.1}{3} = 0.7\)第4维:
$ \text{平均值}_4 = \frac{0.4 + 0.8 + 1.2}{3} = \frac{2.4}{3} = 0.8$
得到平均后的向量:
[0.5, 0.6, 0.7, 0.8]
-
取最大值(Max Pooling)
对于每个维度,取所有词向量中该维度的最大值。
第1维:
$ \text{最大值}_1 = \max(0.1, 0.5, 0.9) = 0.9$
第2维:
$ \text{最大值}_2 = \max(0.2, 0.6, 1.0) = 1.0$
第3维:
\(\text{最大值}_3 = \max(0.3, 0.7, 1.1) = 1.1\)
第4维:
\(\text{最大值}_4 = \max(0.4, 0.8, 1.2) = 1.2\)
得到最大值池化后的向量:
[0.9, 1.0, 1.1, 1.2]
-
-
输入到神经网络
- 将池化后的向量作为输入,维度为4。
- 根据任务需求,设计神经网络的结构。
神经网络结构
- 输入层:4个神经元,对应池化后的向量的每个元素。
- 隐藏层:例如包含4个神经元的隐藏层。
- 输出层:根据任务需求设置。
示意图
输入层 (4个节点) --> 隐藏层 (4个节点) --> 输出层
总结与比较
-
堆叠方法
- 优点:保留了所有词的完整信息,包括词的顺序(在展开时保留了顺序)。
- 缺点:当句子长度不固定时,输入向量的长度也会变化,不利于处理变长的输入。
-
池化方法
- 优点:无论句子包含多少个词,最终的输入向量长度都是固定的,便于处理不同长度的句子。
- 缺点:在取平均或最大值的过程中,可能会丢失部分信息,特别是词的顺序和细节信息。
实际应用中的考虑
- 变长输入的处理
- 在实际应用中,句子的长度通常是不固定的。为了在标准神经网络中处理变长的句子,通常需要将输入转换为固定长度。
- 截断或填充:将句子截断或用特殊的填充词(如
<PAD>
)补齐到固定长度,然后按上述方法处理。 - 动态池化:采用更复杂的池化方法,或者使用注意力机制来对输入进行加权求和。
- 截断或填充:将句子截断或用特殊的填充词(如
完整的模型示例
假设我们要构建一个文本分类模型,步骤如下:
-
预处理
- 将文本分词,得到单词列表。
- 使用词汇表将单词映射为索引或直接映射为词向量。
-
词向量表示
- 使用预训练的词向量,或随机初始化词向量。
-
特征提取
- 方法一:将词向量堆叠并展开。
- 方法二:对词向量进行池化(取平均或最大值)。
-
模型构建
- 输入层:接受处理后的固定长度向量。
- 隐藏层:一个或多个全连接层,激活函数可以使用ReLU、Sigmoid等。
- 输出层:根据分类任务的类别数,设置对应的神经元数量,使用Softmax激活函数。
-
训练与优化
- 定义损失函数(如交叉熵损失)。
- 使用优化算法(如梯度下降、Adam)训练模型。
小结
通过以上具体的例子,我们演示了如何将多个词向量堆叠成矩阵并展开,或者通过池化方法将其转换为固定长度的向量,然后输入到标准的前馈神经网络中进行处理。
这种方法在处理定长输入时较为方便,但在处理变长序列、保留词序信息以及捕捉长距离依赖关系方面,可能不如循环神经网络等模型有效。