深度学习:如何构建字符级嵌入?

Posted

技术标签:

【中文标题】深度学习:如何构建字符级嵌入?【英文标题】:Deep learning : How to build character level embedding? 【发布时间】:2019-10-01 13:05:04 【问题描述】:

我正在尝试在我的模型中使用字符级嵌入,但我对字符级嵌入毫无疑问。

所以对于词级嵌入:

Sentence = 'this is a example sentence'

创建词汇:

vocab = 'this' : 0 , 'is' :1 , 'a': 2 'example' : 3, 'sentence' : 4 

句子进行编码:

encoded_sentence = [ 0, 1 , 2 , 3 , 4 ]

现在将其发送到任何预训练的嵌入,例如 word2vec 或 glove:

每个 id 将被替换为 300 或嵌入 dim:

embedding_sentence = [ [ 0.331,0.11 , ----300th dim ] , [ 0.331,0.11 , ----300th dim ] , [ 0.331,0.11 , ----300th dim ] , [ 0.331,0.11 , ----300th dim ] , [ 0.331,0.11 , ----300th dim ] ] 

如果我们正在处理批处理,那么我们会填充句子

所以形状是这样的:

[ batch_size , max_sentence_length , embedding_dim ]

现在对于字符级嵌入,我几乎没有疑问:

所以对于字符级嵌入:

Sentence = 'this is a example sentence'

创建 char_vocab:

char_vocab = [' ', 'a', 'c', 'e', 'h', 'i', 'l', 'm', 'n', 'p', 's', 't', 'x']

int_to_vocab = n:m for m,n in enumerate(char_vocab)

按字符级别对句子进行编码:

现在这是我的困惑,所以在词嵌入中,我们首先对句子进行标记,然后使用 vocab id (word_id) 对每个标记进行编码

但是对于字符嵌入,如果我对句子进行标记,然后使用字符级别进行编码,那么形状将是 4 暗淡,我无法将其提供给 LSTM。

但如果我没有标记化并直接编码原始文本,那么它是 3 暗淡的,我可以将它提供给 LSTM

例如:

使用标记化:

 token_sentence = ['this','is','a','example','sentence']

encoded_char_level = []

for words in token_sentence:
    char_lvel = [int_to_vocab[char] for char in words]
    encoded_char_level.append(char_lvel)

看起来像这样:

[[0, 1, 2, 3],
 [2, 3],
 [5],
 [6, 7, 5, 8, 9, 10, 6],
 [3, 6, 11, 0, 6, 11, 12, 6]]

现在我们要填充两个 level ,一个是 char_level 填充,第二个是句子级填充:

char_level_padding:

[[0, 1, 2, 3, 0, 0, 0,0],
 [2, 3, 0, 0, 0, 0, 0, 0],
 [5, 0, 0, 0, 0, 0, 0, 0],
 [6, 7, 5, 8, 9, 10, 6, 0],
 [3, 6, 11, 0, 6, 11, 12, 6]]

现在如果我们有 4 个句子,那么我们必须用 max sentence len 填充每个句子,这样形状就会是:

[batch_size , max_sentence_length , max_char_length ] 

现在如果我们将它传递给嵌入层,那么:

[ batch_size , max_sentence_length, max_char_length , embedding_dim ] 

这是 4 暗。

如何对字符级别的句子进行编码并与 tensorflow LSTM 层一起使用?

Because lstm takes 3 dim input [ batch_size , max_sequence_length , embedding_dim ] 

我可以像这样使用它吗:

[ Batch_size , ( max_sentence_length x max_char_length ) , dim ] 

例如:

[ 12 , [ 3 x 4 ] , 300 ]

【问题讨论】:

通常,您会在字符端使用降维技术,例如 cnn 层,然后是 pool 层,它允许您拥有LSTM 之前的 3 维张量。 @BenjaminBreton 我明白你的意思,通常开发人员使用 cnn 进行调暗,然后从那里提取特征,但我想将嵌入直接提供给 lstm,我不想在这里使用 cnn。 可以直接在句子中使用字符序列,并添加特殊标记告诉网络它属于不同的单词 @AadityaUra 我明白你的问题。但是,你想预测什么 @yahocho 这是分类问题,类将是二进制或多标签。 【参考方案1】:

您可以连接具有固定长度的字符级特征。

例如:

``[[0, 1, 2, 3, 0, 0, 0,0],
  [2, 3, 0, 0, 0, 0, 0, 0],
  [5, 0, 0, 0, 0, 0, 0, 0],
  [6, 7, 5, 8, 9, 10, 6, 0],
  [3, 6, 11, 0, 6, 11, 12, 6]]``

可以改为: [[0, 1, 2, 3, 0, 0, 0,0,2, 3, 0, 0, 0, 0, 0, 0,5, 0, 0, 0, 0, 0, 0, 0,6, 7, 5, 8, 9, 10, 6, 0,3, 6, 11, 0, 6, 11, 12, 6]]

【讨论】:

以上是关于深度学习:如何构建字符级嵌入?的主要内容,如果未能解决你的问题,请参考以下文章

深度学习保姆级入门教程 -- 论文+代码+常用工具

深度学习保姆级入门教程 -- 论文+代码+常用工具

Paddle-Mobile 百度嵌入式深度学习框架

百度嵌入式深度学习框架Paddle-Mobile介绍

如何构建深度学习预训练模型?

深度学习与爬虫实例教学--深度学习模型构建和训练