当前位置:   article > 正文

从零开始 NLP:使用序列到序列网络和注意力实现翻译_注意力机制序列到序列模型实现英翻汉

注意力机制序列到序列模型实现英翻汉

pytorch官方例子学习心得

1、具体任务:
运用seq2seq模型实现法语和英语互翻
  • 1
2、官方项目连接

3、项目流程:

  • 3.1 准备数据

    • 3.1.1 准备原始数据:读取下载好的数据
      原始数据样式

    • 3.1.2 读取下载好的数据

      • 3.1.2.1 生成语言训练对 pairs

        例如: ['va !', 'go .']  = [被翻译词,翻译词]
        解释:列表里面一个元素为原文中的一行,英语和法语通过空格(\t )分开
        
        • 1
        • 2

        ① 标准化处理读入的数据(lines)—>

        * 字母转小写、截取掉字符中的空格
        * unicode编码转化为ascii编码
        * 通过正则匹配 ---> 拆分字母和标点符号
        * 处理后数据:len(pairs)=135842 ,pairs[:2]=[['go .', 'va !'], ['run !', 'cours !']]
        
        • 1
        • 2
        • 3
        • 4

        ② 为了快速训练,根据条件筛选出可训练的数据

        条件1:最大长度为 10 个单词(包括结尾标点符号)
        条件2:筛选为转换为英文以"i am"或"he is"等形式的句子
        筛选后:10599 sentence pairs
        
        • 1
        • 2
        • 3
    • 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……}
      
      • 1
      • 2
      • 3
      • 4
      • 5
  • 3.2 构建模型

    • ① 初始化编码器

      embedding层(输入言语的词向量层):
         输入:input_size -- 输入言语的字典的长度 ;
               hidden_size -- 隐藏层细胞数
         输出:output;
              hidden:
      
         pytorch加载自己训练的词向量:
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      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))
      
      • 1
      • 2
      • 3
      RNN层(记忆遗忘与传递):
               采用 gru:GRU(256, 256)
      
      • 1
      • 2
    • ② 初始化 带attention的解码器

      embedding层(输出言语的词向量层):
      
      • 1
  • 3.3 训练模型参数

    • ① 定义参数优化器:随机梯度下降

    • ② 定义损失函数:nn.NLLLoss() 与解码器中的log_softmax() 组合

    • ③ 准备训练的数据:

        类型:list
        长度:7500(给定参数)
      
        单值类型:tuple
        长度:2(输入--输出 翻译前--翻译后)
      
      • 1
      • 2
      • 3
      • 4
      • 5
       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')
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      张量的值,分别为英文和法文字典中词对应的索引
      
      • 1
  • ④ 单次训练(一个词一个词进入模型训练):网络结构图参考官网

    隐藏层参数:
       首先,编码器隐藏层参数初始化为0
    
    参数优化器:
        解码器和编码器,参数的梯度置零
    
    编码器的输出:
        初始一个最外层长度为设置固定长度的0张量
    
     开始编码:
         变量被翻译语言的词,一个词一个词循环进入模型;
         更新隐藏层的参数张量;作为解码器的输入已经编码器更新的输入
         更新编码输出张量,按每次输入词的位置更新,如果长度没到固定长度的保持为0;作为解码器的输入
    
    开始解码:
         解码器输入:用目标值做输入或用预测值做输入,增加鲁棒性
         更新隐藏层:共享编码器的
    
    
    损失函数反向传播
    参数优化器:
         更新参数
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/352846
推荐阅读
相关标签
  

闽ICP备14008679号