day5-机器翻译

内容包括:

  1. 机器翻译难点
  2. 数据预处理
    1. 数据清洗

3.encoder-decoder结构

机器翻译难点:

普通的rnn,输入n个x,那么输出n个y,但是机器翻译输入和输出长度往往并不相等

数据预处理

数据清洗

  • 将输入转换为minibatch的形式
  • 并且去除“乱码”字符,也就是不符合gbk一类编码的字符
  • 统一转换为小写

分词

转换为源单词和目标翻译单词之间的一一映射,也就是一个源单词对应一个目标单词

建立字典

e.g 建立一个英语字典和一个法语字典,每个单词对应一个idx

所有单词建立为一个tokens

构造一个类,实现char_to_idx和idx_to_char,并且构建lengetitem函数,实现可以使用[]直接调用(类似于dict)

载入数据

  1. 填充
  • 设定一个阈值,如果句子长度大于阈值,那么截断,反之填充(padding token)
  1. 将每一行的单词转换为idx,并且如果不是源语句,那么在语句前后加上bos和eos标记
    3.计算有效长度(也就是没有填充时的长度,计算loss时只算没填充的长度的loss)

总的来说:
构建字典
将一个句子转换为对应idx
读取数据(batch)

encoder-decoder

刚才提到机器翻译的难点是输入和输出不等长,如何处理?
常用encoder-decoder结构

具体来说:seq to seq就是encoder-decoder的实现

sequence to sequence

encoder:可以是任意rnn结构:gru,lstm
decode:为rnn,给输入然后输出预测下一个输出,H1为encoder的输出(初始化),第一个x(输入)为bos符号,结合H1,预测第一个输出,然后结合第一个输出和隐藏状态(H1),预测下一个(训练时x和y都是已知的),直到预测到了eos结束

训练时输入的并不是直接的idx,而
是idx对应的embedding向量(embedding是已知的,类似于查表)

encoder:
begin state是对encoder的初始化
batchsize:几句话
seqlen是一句话有几个单词

decoder:
将encoder的state输出和自己的embedding输入一起送到decoder,得到out,out再送进全连接层进行分类,得到最终翻译结果
输出为(batch_size, seq_len, vocab_size),也就是(句子数量,每个句子单词数量,字典中每个单词的概率)

损失函数:
只计算有效长度的loss,构建一个sequence_mask函数

训练:
input:bos+word
label:word+eos
有效长度:-1是因为总有一个bos或者eos是多余的

beam search

之前decoder的输出总是当前最大概率的单词,但是这样没有考虑到连贯性,也就是语句通顺,理论上来说可以尝试所有单词所构成的句子的总和,然后选择全局最优解,但是这样解空间太大,beam search就是一种剪枝,每次选取当前bfs层概率最大的两个加入到当前状态,后续计算概率最大需考虑前面所有状态加上当前层的状态的概率

你可能感兴趣的:(day5-机器翻译)