从零开始 NLP:使用序列到序列网络和注意力实现翻译
pytorch官方例子学习心得
1、具体任务:
运用seq2seq模型实现法语和英语互翻
2、官方项目连接
3、项目流程:
-
3.1 准备数据
-
3.1.1 准备原始数据:读取下载好的数据

-
3.1.2 读取下载好的数据
-
3.1.2.1 生成语言训练对 pairs
例如: ['va !', 'go .'] = [被翻译词,翻译词] 解释:列表里面一个元素为原文中的一行,英语和法语通过空格(\t )分开① 标准化处理读入的数据(lines)—>
* 字母转小写、截取掉字符中的空格 * unicode编码转化为ascii编码 * 通过正则匹配 ---> 拆分字母和标点符号 * 处理后数据:len(pairs)=135842 ,pairs[:2]=[['go .', 'va !'], ['run !', 'cours !']]② 为了快速训练,根据条件筛选出可训练的数据
条件1:最大长度为 10 个单词(包括结尾标点符号) 条件2:筛选为转换为英文以"i am"或"he is"等形式的句子 筛选后:10599 sentence pairs
-
-
3.1.2.2 初始化被翻译语言的类和翻译语言的类
该语言的名称:input_lang.name = 'fra' 法语该语言的词的个数(包括起始占位符):n_words = 4345该语言每个字位置索引的字典:word2index :{'j': 2, 'ai': 3, 'ans': 4 ……}该语言每个字位置索引的字典:index2word :{0: 'SOS', 1: 'EOS', 2: 'j', 3: 'ai' ……}该语言每个字出现频率的字典:word2count : {'j': 414, 'ai': 340, 'ans': 55, '.': 10262……}
-
-
3.2 构建模型
-
① 初始化编码器
embedding层(输入言语的词向量层):输入:input_size -- 输入言语的字典的长度 ;hidden_size -- 隐藏层细胞数输出:output;hidden:pytorch加载自己训练的词向量:self.word_embeds = nn.Embedding(vocab_size, embedding_dim) pretrained_weight = np.array(pretrained_weight) self.word_embeds .weight.data.copy_(torch.from_numpy(pretrained_weight))RNN层(记忆遗忘与传递):采用 gru:GRU(256, 256) -
② 初始化 带attention的解码器
embedding层(输出言语的词向量层):
-
-
3.3 训练模型参数
-
① 定义参数优化器:随机梯度下降
-
② 定义损失函数:nn.NLLLoss() 与解码器中的log_softmax() 组合
-
③ 准备训练的数据:
类型:list长度:7500(给定参数)单值类型:tuple长度:2(输入--输出 翻译前--翻译后)training_pairs[0][0] =tensor([[24],[25],[75],[ 5],[ 1]], device='cuda:0')training_pairs[0][1] = tensor([[ 14],[ 15],[345],[ 4],[ 1]], device='cuda:0')张量的值,分别为英文和法文字典中词对应的索引
-
-
④ 单次训练(一个词一个词进入模型训练):网络结构图参考官网
隐藏层参数:首先,编码器隐藏层参数初始化为0参数优化器:解码器和编码器,参数的梯度置零编码器的输出:初始一个最外层长度为设置固定长度的0张量开始编码:变量被翻译语言的词,一个词一个词循环进入模型;更新隐藏层的参数张量;作为解码器的输入已经编码器更新的输入更新编码输出张量,按每次输入词的位置更新,如果长度没到固定长度的保持为0;作为解码器的输入开始解码:解码器输入:用目标值做输入或用预测值做输入,增加鲁棒性更新隐藏层:共享编码器的损失函数反向传播 参数优化器:更新参数
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
