You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

tutorial_3_embedding.rst 9.2 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. =========================================
  2. 使用Embedding模块将文本转成向量
  3. =========================================
  4. 这一部分是一个关于在fastNLP当中使用embedding的教程。
  5. 教程目录:
  6. - `Part I: embedding介绍`_
  7. - `Part II: 使用随机初始化的embedding`_
  8. - `Part III: 使用预训练的静态embedding`_
  9. - `Part IV: 使用预训练的Contextual Embedding(ELMo & BERT)`_
  10. - `Part V: 使用character-level的embedding`_
  11. - `Part VI: 叠加使用多个embedding`_
  12. ---------------------------------------
  13. Part I: embedding介绍
  14. ---------------------------------------
  15. 与torch.nn.Embedding类似,fastNLP的embedding接受的输入是一个被index好的序列,输出的内容是这个序列的embedding结果。
  16. fastNLP的embedding包括了预训练embedding和随机初始化embedding。
  17. ---------------------------------------
  18. Part II: 使用随机初始化的embedding
  19. ---------------------------------------
  20. 使用随机初始化的embedding参见 :class:`~fastNLP.modules.encoder.embedding.Embedding` 。
  21. 可以传入词表大小和embedding维度:
  22. .. code-block:: python
  23. embed = Embedding(10000, 50)
  24. 也可以传入一个初始化的参数矩阵:
  25. .. code-block:: python
  26. embed = Embedding(init_embed)
  27. 其中的init_embed可以是torch.FloatTensor、torch.nn.Embedding或者numpy.ndarray。
  28. ---------------------------------------
  29. Part III: 使用预训练的静态embedding
  30. ---------------------------------------
  31. 在使用预训练的embedding之前,需要根据数据集的内容构建一个词表 :class:`~fastNLP.core.vocabulary.Vocabulary` ,在
  32. 预训练embedding类初始化的时候需要将这个词表作为参数传入。
  33. 在fastNLP中,我们提供了 :class:`~fastNLP.modules.encoder.embedding.StaticEmbedding` 这一个类。
  34. 通过 :class:`~fastNLP.modules.encoder.embedding.StaticEmbedding` 可以加载预训练好的静态
  35. Embedding,例子如下:
  36. .. code-block:: python
  37. embed = StaticEmbedding(vocab, model_dir_or_name='en-glove-6b-50', requires_grad=True)
  38. vocab为根据数据集构建的词表,model_dir_or_name可以是一个路径,也可以是embedding模型的名称:
  39. 1 如果传入的是路径,那么fastNLP将会根据该路径来读取预训练的权重文件并将embedding加载进来(glove
  40. 和word2vec类型的权重文件都支持)
  41. 2 如果传入的是模型名称,那么fastNLP将会根据名称查找embedding模型,如果在cache目录下找到模型则会
  42. 自动加载;如果找不到则会自动下载。可以通过环境变量 ``FASTNLP_CACHE_DIR`` 来自定义cache目录,如::
  43. $ FASTNLP_CACHE_DIR=~/fastnlp_cache_dir python your_python_file.py
  44. 这个命令表示fastNLP将会在 `~/fastnlp_cache_dir` 这个目录下寻找模型,找不到则会自动将模型下载到这个目录
  45. 目前支持的静态embedding模型有:
  46. ========================== ================================
  47. 模型名称 模型
  48. -------------------------- --------------------------------
  49. en glove.840B.300d
  50. -------------------------- --------------------------------
  51. en-glove-840d-300 glove.840B.300d
  52. -------------------------- --------------------------------
  53. en-glove-6b-50 glove.6B.50d
  54. -------------------------- --------------------------------
  55. en-word2vec-300 谷歌word2vec 300维
  56. -------------------------- --------------------------------
  57. en-fasttext 英文fasttext 300维
  58. -------------------------- --------------------------------
  59. cn 腾讯中文词向量 200维
  60. -------------------------- --------------------------------
  61. cn-fasttext 中文fasttext 300维
  62. ========================== ================================
  63. -----------------------------------------------------------
  64. Part IV: 使用预训练的Contextual Embedding(ELMo & BERT)
  65. -----------------------------------------------------------
  66. 在fastNLP中,我们提供了ELMo和BERT的embedding: :class:`~fastNLP.modules.encoder.embedding.ElmoEmbedding`
  67. 和 :class:`~fastNLP.modules.encoder.embedding.BertEmbedding` 。
  68. 与静态embedding类似,ELMo的使用方法如下:
  69. .. code-block:: python
  70. embed = ElmoEmbedding(vocab, model_dir_or_name='small', requires_grad=False)
  71. 目前支持的ElmoEmbedding模型有:
  72. ========================== ================================
  73. 模型名称 模型
  74. -------------------------- --------------------------------
  75. small allennlp ELMo的small
  76. -------------------------- --------------------------------
  77. medium allennlp ELMo的medium
  78. -------------------------- --------------------------------
  79. original allennlp ELMo的original
  80. -------------------------- --------------------------------
  81. 5.5b-original allennlp ELMo的5.5B original
  82. ========================== ================================
  83. BERT-embedding的使用方法如下:
  84. .. code-block:: python
  85. embed = BertEmbedding(
  86. vocab, model_dir_or_name='en-base-cased', requires_grad=False, layers='4,-2,-1'
  87. )
  88. 其中layers变量表示需要取哪几层的encode结果。
  89. 目前支持的BertEmbedding模型有:
  90. ========================== ====================================
  91. 模型名称 模型
  92. -------------------------- ------------------------------------
  93. en bert-base-cased
  94. -------------------------- ------------------------------------
  95. en-base-uncased bert-base-uncased
  96. -------------------------- ------------------------------------
  97. en-base-cased bert-base-cased
  98. -------------------------- ------------------------------------
  99. en-large-uncased bert-large-uncased
  100. -------------------------- ------------------------------------
  101. en-large-cased bert-large-cased
  102. -------------------------- ------------------------------------
  103. -------------------------- ------------------------------------
  104. en-large-cased-wwm bert-large-cased-whole-word-mask
  105. -------------------------- ------------------------------------
  106. en-large-uncased-wwm bert-large-uncased-whole-word-mask
  107. -------------------------- ------------------------------------
  108. en-base-cased-mrpc bert-base-cased-finetuned-mrpc
  109. -------------------------- ------------------------------------
  110. -------------------------- ------------------------------------
  111. multilingual bert-base-multilingual-cased
  112. -------------------------- ------------------------------------
  113. multilingual-base-uncased bert-base-multilingual-uncased
  114. -------------------------- ------------------------------------
  115. multilingual-base-cased bert-base-multilingual-cased
  116. ========================== ====================================
  117. -----------------------------------------------------
  118. Part V: 使用character-level的embedding
  119. -----------------------------------------------------
  120. 除了预训练的embedding以外,fastNLP还提供了CharEmbedding: :class:`~fastNLP.modules.encoder.embedding.CNNCharEmbedding` 和
  121. :class:`~fastNLP.modules.encoder.embedding.LSTMCharEmbedding` 。
  122. CNNCharEmbedding的使用例子如下:
  123. .. code-block:: python
  124. embed = CNNCharEmbedding(vocab, embed_size=100, char_emb_size=50)
  125. 这表示这个CNNCharEmbedding当中character的embedding维度大小为50,返回的embedding结果维度大小为100。
  126. 与CNNCharEmbedding类似,LSTMCharEmbedding的使用例子如下:
  127. .. code-block:: python
  128. embed = LSTMCharEmbedding(vocab, embed_size=100, char_emb_size=50)
  129. 这表示这个LSTMCharEmbedding当中character的embedding维度大小为50,返回的embedding结果维度大小为100。
  130. -----------------------------------------------------
  131. Part VI: 叠加使用多个embedding
  132. -----------------------------------------------------
  133. 在fastNLP中,我们使用 :class:`~fastNLP.modules.encoder.embedding.StackEmbedding` 来叠加多个embedding
  134. 例子如下:
  135. .. code-block:: python
  136. embed_1 = StaticEmbedding(vocab, model_dir_or_name='en-glove-6b-50', requires_grad=True)
  137. embed_2 = StaticEmbedding(vocab, model_dir_or_name='en-word2vec-300', requires_grad=True)
  138. stack_embed = StackEmbedding([embed_1, embed_2])
  139. StackEmbedding会把多个embedding的结果拼接起来,如上面例子的stack_embed返回的embedding维度为350维。
  140. 除此以外,还可以把静态embedding跟上下文相关的embedding拼接起来:
  141. .. code-block:: python
  142. elmo_embedding = ElmoEmbedding(vocab, model_dir_or_name='medium', layers='0,1,2', requires_grad=False)
  143. glove_embedding = StaticEmbedding(vocab, model_dir_or_name='en-glove-6b-50', requires_grad=True)
  144. stack_embed = StackEmbedding([elmo_embedding, glove_embedding])