当前位置:   article > 正文

Transformer代码详解(-)-从数据处理到嵌入【包含数据集可构造/数据嵌入和位置嵌入的详解】_transformer的n+1的查询嵌入

transformer的n+1的查询嵌入
  1. src_shape=["你好","生日快乐"]
  2. tgt_shape=["hello","happy birthday to you"]
  3. #1.embeding 先构造数据集,再构造嵌入
  4. batch_size=2 #以两条样本为例
  5. src_shape=torch.Tensor([2,4]).to(torch.int32) #源:第一个样本长度为2 第二个样本长度为4 你好 生日快乐
  6. tgt_shape=torch.Tensor([1,4]).to(torch.int32) #目标:第一个样本长度为1 第二个样本长度为4 hello happy birthday to you
  7. #获取每一个词对应的索引:查询词汇表中
  8. #数据处理:原始文本变为数字——即每个单词在词表中的位置;然后通过padding处理得到句子的二维索引表示
  9. src_index = [[1,2], [3,1,5,6]]
  10. tgt_index = [[7], [13,67,78,54]]
  11. #因为输入模型中的长度要一致,所以需要进行处理 然后加padding apdding的索引默认是0
  12. for i in len(src_shape):
  13. assert len(src_index[i])==src_shape[i]
  14. # 设置序列最大长度
  15. max_num_word = 5
  16. len_word=8 #单词表大小
  17. #得到源句子和目标句子
  18. #src_seq = [F.pad(torch.tensor(L),(0, max_num_word - len(L))) for i, L in enumerate(src_index)]
  19. #print(src_seq) #[tensor([1, 2, 0, 0, 0]), tensor([3, 1, 5, 6, 0])]
  20. #然后我们需要把这写batchsize个样本给合成一个二维的张量 因此首先变为2维-增加维度,然后在第0维cat 这样每一个样本就有一个向量变为一个二维张量
  21. assert len(src_index)==batch_size
  22. src_cat_result=torch.cat([torch.unsqueeze(F.pad(torch.tensor(L),(0, src_max_num_word - len(L))),0) for i, L in enumerate(src_index)])
  23. #print(src_cat_result) #tensor([[1, 2, 0, 0, 0], [3, 1, 5, 6, 0]])
  24. assert len(tgt_index)==batch_size
  25. tgt_cat_result=torch.cat([torch.unsqueeze(F.pad(torch.tensor(L),(0, tgt_max_num_word - len(L))),0) for i, L in enumerate(tgt_index)])
  26. #嵌入:将索引转化维向量表示
  27. model_dim=8 #论文中是512
  28. #嵌入使用pytprch中的 词向量嵌入,里面包含所有的单词
  29. src_embedding_table=nn.Embedding(src_len_word+1,model_dim) #+1是运因为有paddiing,这个也是文本中所涉及的单词
  30. tgt_embedding_table=nn.Embedding(tgt_len_word+1,model_dim)
  31. #print(src_embedding_table.weight)
  32. """
  33. 第一行是padding的,其余8个表示文本中单词表为8,列表示嵌入维度,因此一行表示一个词的嵌入
  34. tensor([[-1.2555, -0.7370, 1.4169, -0.0135, 0.1515, 0.1596, 1.2738, -1.3509], padding的
  35. [-0.2124, 2.1522, 0.7495, 0.6297, 0.5902, 2.2523, 0.2023, 0.1858],
  36. [ 0.2194, 0.0171, 0.9608, -1.0578, 1.0288, 0.2693, -1.3096, 0.2752],
  37. [-0.7234, 0.0349, -0.5287, 1.0626, 0.2660, -2.7938, 1.7546, 0.6249],
  38. [ 0.9379, 1.5381, 0.8142, 1.3533, -0.0833, -0.4148, -1.6053, -1.0058],
  39. [-1.1222, 0.9535, 0.2647, 0.4451, -2.0066, 0.8431, 0.1354, -0.2863],
  40. [ 0.4703, 0.8993, 0.0897, -1.6634, -0.4775, 1.8519, 0.2723, 1.5300],
  41. [ 0.8387, -0.1637, -0.9713, -1.3232, -0.7950, -0.1871, -1.2212, 0.7863],
  42. [-0.1340, 1.7016, -1.1327, 0.9578, 0.2550, -1.3456, -0.6001, 1.5825]],
  43. requires_grad=True)
  44. src_embedding=src_embedding_table(src_cat_result) #调用embedding类的forward方法
  45. #print(src_embedding)
  46. 得到了每一句话的表示:2个句子*每一句5个词*每一个词8维
  47. tensor([[[-1.0475, 0.2883, -1.9625, 0.9092, 0.3110, 0.4850, 0.0567,
  48. 0.8287],
  49. [-0.4096, 0.4550, -0.2292, -0.1558, 0.1996, 0.2696, 0.4571,
  50. 1.7479],
  51. [ 0.6344, 0.5071, 1.0565, 1.0850, -1.0610, -0.0961, -1.0493,
  52. 0.2836],
  53. [ 0.6344, 0.5071, 1.0565, 1.0850, -1.0610, -0.0961, -1.0493,
  54. 0.2836],
  55. [ 0.6344, 0.5071, 1.0565, 1.0850, -1.0610, -0.0961, -1.0493,
  56. 0.2836]],
  57. [[-3.2312, 0.0042, 0.2851, -0.3745, 0.8082, 0.3877, -0.3762,
  58. 0.8496],
  59. [-1.0475, 0.2883, -1.9625, 0.9092, 0.3110, 0.4850, 0.0567,
  60. 0.8287],
  61. [-0.0264, -0.7717, -0.3651, -1.0353, -2.3864, 0.6747, -0.4873,
  62. 1.3909],
  63. [-0.2352, 0.2003, 1.8471, -1.1417, -0.1079, 0.5878, -0.0224,
  64. -0.4107],
  65. [ 0.6344, 0.5071, 1.0565, 1.0850, -1.0610, -0.0961, -1.0493,
  66. 0.2836]]], grad_fn=<EmbeddingBackward>)
  67. #位置嵌入:使用sin cos是因为泛化能力比较好,而且还具有对称性 句子数*每一句最大词数*嵌入维度 这里也可以用两个for循环来填充每一个句子的二维位置矩阵
  68. #我们这种方法是矩阵相乘,应用了广播机制
  69. max_position_len=5 #位置嵌入的最大长度 和句子的长度相等吧:因为句子中每个词都有位置
  70. pos_mat=torch.arange(max_position_len).reshape((-1,1))
  71. i_mat=torch.pow(10000,torch.arange(0,8,2).reshape((-1,1))/model_dim)#2i应该是表示奇数列吧,因为是从0开始索引
  72. pe_embedding_table=torch.zeros(max_position_len,model_dim)
  73. div_term = torch.exp(torch.arange(0, model_dim, 2) * -(math.log(10000.0) / model_dim))
  74. pe_embedding_table[:,0::2]=torch.sin(pos_mat*div_term) #[:,0::2]表示选择所有行以及偶数列 根据公式pos_mat*i_mat会报错
  75. pe_embedding_table[:,1::2]=torch.cos(pos_mat*div_term) #[:,1::2]表示选择所有行以及奇数列
  76. pe_embedding=nn.Embedding(max_position_len,model_dim)
  77. pe_embedding.weight=nn.Parameter(pe_embedding_table,requires_grad=False) #权重用自己的,不进行学习
  78. #注意这里借鉴词嵌入的方法,流程一样,其中参数要传入位置而不是单词
  79. src_pos_cat=torch.cat([torch.unsqueeze(torch.arange(max(src_shape)),0) for i in src_shape])
  80. tgt_pos_cat=torch.cat([torch.unsqueeze(torch.arange(max(tgt_shape)),0) for i in tgt_shape])
  81. src_pe_embedding=pe_embedding(src_pos_cat)
  82. #print(src_pe_embedding)
  83. """
  84. tensor([[[ 0.0000e+00, 1.0000e+00, 0.0000e+00, 1.0000e+00, 0.0000e+00,
  85. 1.0000e+00, 0.0000e+00, 1.0000e+00],
  86. [ 8.4147e-01, 5.4030e-01, 9.9833e-02, 9.9500e-01, 9.9998e-03,
  87. 9.9995e-01, 1.0000e-03, 1.0000e+00],
  88. [ 9.0930e-01, -4.1615e-01, 1.9867e-01, 9.8007e-01, 1.9999e-02,
  89. 9.9980e-01, 2.0000e-03, 1.0000e+00],
  90. [ 1.4112e-01, -9.8999e-01, 2.9552e-01, 9.5534e-01, 2.9995e-02,
  91. 9.9955e-01, 3.0000e-03, 1.0000e+00]],
  92. [[ 0.0000e+00, 1.0000e+00, 0.0000e+00, 1.0000e+00, 0.0000e+00,
  93. 1.0000e+00, 0.0000e+00, 1.0000e+00],
  94. [ 8.4147e-01, 5.4030e-01, 9.9833e-02, 9.9500e-01, 9.9998e-03,
  95. 9.9995e-01, 1.0000e-03, 1.0000e+00],
  96. [ 9.0930e-01, -4.1615e-01, 1.9867e-01, 9.8007e-01, 1.9999e-02,
  97. 9.9980e-01, 2.0000e-03, 1.0000e+00],
  98. [ 1.4112e-01, -9.8999e-01, 2.9552e-01, 9.5534e-01, 2.9995e-02,
  99. 9.9955e-01, 3.0000e-03, 1.0000e+00]]],
  100. grad_fn=<EmbeddingBackward>)
  101. """
  102. tgt_pe_embedding=pe_embedding(tgt_pos_cat)
  103. print(tgt_pe_embedding)
  104. tensor([[[ 0.0000e+00, 1.0000e+00, 0.0000e+00, 1.0000e+00, 0.0000e+00,
  105. 1.0000e+00, 0.0000e+00, 1.0000e+00],
  106. [ 8.4147e-01, 5.4030e-01, 9.9833e-02, 9.9500e-01, 9.9998e-03,
  107. 9.9995e-01, 1.0000e-03, 1.0000e+00],
  108. [ 9.0930e-01, -4.1615e-01, 1.9867e-01, 9.8007e-01, 1.9999e-02,
  109. 9.9980e-01, 2.0000e-03, 1.0000e+00],
  110. [ 1.4112e-01, -9.8999e-01, 2.9552e-01, 9.5534e-01, 2.9995e-02,
  111. 9.9955e-01, 3.0000e-03, 1.0000e+00]],
  112. [[ 0.0000e+00, 1.0000e+00, 0.0000e+00, 1.0000e+00, 0.0000e+00,
  113. 1.0000e+00, 0.0000e+00, 1.0000e+00],
  114. [ 8.4147e-01, 5.4030e-01, 9.9833e-02, 9.9500e-01, 9.9998e-03,
  115. 9.9995e-01, 1.0000e-03, 1.0000e+00],
  116. [ 9.0930e-01, -4.1615e-01, 1.9867e-01, 9.8007e-01, 1.9999e-02,
  117. 9.9980e-01, 2.0000e-03, 1.0000e+00],
  118. [ 1.4112e-01, -9.8999e-01, 2.9552e-01, 9.5534e-01, 2.9995e-02,
  119. 9.9955e-01, 3.0000e-03, 1.0000e+00]]],
  120. grad_fn=<EmbeddingBackward>)
  121. #encoding中的mask:padding的标记为-inf

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号