专栏首页ATYUN订阅号语言生成实战:自己训练能讲“人话”的神经网络(下)

语言生成实战:自己训练能讲“人话”的神经网络(下)

在昨天的学习当中,我们了解了培养一个会说话的语言生成模型所需要的如何创建数据集这一模块,今天我们继续学习构建语言生成模型。

前文链接:语言生成实战:自己训练能讲“人话”的神经网络(上)

2.构建模型

我们将使用长短期记忆网络(LSTM)。LSTM的一个重要优点是能够理解对整个序列的依赖性,因此,句子的开头可能会对要预测的第15个单词产生影响。另一方面,递归神经网络(RNNs)只意味着依赖于网络的前一个状态,只有前一个词才能帮助预测下一个状态。如果选择RNNs,我们很快就会错过上下文,因此,LSTMs似乎是正确的选择。

a.模型架构

由于训练可以非常(非常)(非常)(非常)(非常)(非常)(非常)(不开玩笑)长,我们将构建一个简单的1嵌入+ 1 LSTM层+ 1密集网络:

def create_model(max_sequence_len, total_words):

      input_len = max_sequence_len - 1

      model = Sequential()

      # Add Input Embedding Layer
      model.add(Embedding(total_words, 10, input_length=input_len))

      # Add Hidden Layer 1 - LSTM Layer
      model.add(LSTM(100))
      model.add(Dropout(0.1))

      # Add Output Layer
      model.add(Dense(total_words, activation='softmax'))

      model.compile(loss='categorical_crossentropy', optimizer='adam')

      return model

model = create_model(max_sequence_len, total_words)
model.summary()

首先,我们添加一个嵌入层。我们将其传递到一个有100个神经元LSTM中,添加一个dropout来控制神经元的协同适应,最后是一个致密层。注意,我们在最后一层应用一个softmax激活函数来获得输出属于每个类的概率。所使用的损失是分类交叉熵,因为它是一个多类分类问题。

模型总结如下:

b.训练模型

我们现在(终于)准备好训练模型了!

model.fit(X, y, batch_size=256, epochs=100, verbose=True)

然后将开始训练模型:

Epoch 1/10
164496/164496 [==============================] - 471s 3ms/step -

loss: 7.0687
Epoch 2/10
73216/164496 [============>.................] - ETA: 5:12 - loss:

7.0513

在CPU上,一个时期大约需要8分钟。在GPU上(例如在Colab中), 您应该修改使用的Keras LSTM网络,因为它不能在GPU上使用。相反,您需要:

# Modify Import
from keras.layers import Embedding, LSTM, Dense, Dropout, CuDNNLSTM

# In the Moddel
...
      model.add(CuDNNLSTM(100))
...

我倾向于在几个步骤中停止训练来进行样本预测,并控制给定几个交叉熵值的模型的质量。

以下是我的观察:

3.生成序列

如果你读过这篇文章,这就是你所期待的:创造新的句子!要生成句子,我们需要对输入文本应用相同的转换。我们将建立一个循环,为给定的迭代次数生成下一个单词:

input_txt = "Machine"

for _ in range(10):

     # Get tokens
     token_list = tokenizer.texts_to_sequences([input_txt])[0]   

     # Pad the sequence
     token_list = pad_sequences([token_list], maxlen=max_sequence_len-1, padding='pre')   

     # Predict the class
     predicted = model.predict_classes(token_list, verbose=0)

     output_word = ""

     # Get the corresponding work
     for word,index in tokenizer.word_index.items():
           if index == predicted:
               output_word = word
               break

input_txt += " "+output_word

当损失在3.1左右时,以“谷歌”作为输入,生成如下句子:

谷歌是世界范围内产生的大量数据

这并没有什么实际意义,但它成功地将谷歌与大量数据的概念联系起来。这是相当令人印象深刻的,因为它仅仅依赖于单词的共现,而没有整合任何语法概念。

如果我们在训练中再等一段时间,让损失减小到2.5,然后输入“Random Forest”:

Random Forest是一个完全托管的服务,旨在支持大量初创企业的愿景基础设施

同样,生成的内容没有意义,但语法结构相当正确。

损失在大约50个时期后开始分化,并从未低于2.5。

我想我们已经达到了发展方法的极限:

同样,生成的东西没有任何意义,但是语法结构是相当正确的。

这种损失在大约50个时期之后就会出现分歧,而且从未低于2.5。

  • 模型仍然很简单
  • 培训数据不够清晰
  • 数据量非常有限

也就是说,我发现结果非常有趣,例如,经过训练的模型可以很容易地部署在Flask Web App上。

结论

本文分享自微信公众号 - ATYUN订阅号(atyun_com)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-09-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 强化学习简介

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    Steve Wang
  • 机器学习-何为优秀的特征

    选择好的特征能让分类器变得有效,这意味着找到好的特征是机器学习中最重要的工作之一。但是怎么样才能获得好的特征?你怎么才能知道,如果你正处理二分类问题。那么好的特...

    亚乐记
  • 局部人脸识别的动态特征匹配(文末附文章及源码地址)

    【导读】该文章被Trans收录。无约束环境下的局部人脸识别(PFR)是一项非常重要的任务,尤其是在视频监控和移动设备等由于遮挡、视野外、大视角等原因容易捕捉到局...

    计算机视觉战队
  • 快速准确的人脸检测&识别新框架(进阶)(文末附源码)

    上一期“计算机视觉战队”已经和大家分享了相关的人脸检测、识别和验证背景及现状的发展状况,今天我们继续说说人脸领域的一些相关技术以及新框架的人脸检测识别系统。

    计算机视觉战队
  • 【科普】精选 7 个生活中的机器学习案例,AI无处不在!

    今天我们就来看看,在日常生活中有哪些最常见的机器学习用例(有时我们甚至没有意识到这些例子涉及机器学习)。本文涵盖了以下常见的机器学习用例:

    昱良
  • Databricks为模型构建和部署启动了automl工具包

    Databricks今天推出了AutoML Toolkit,这是一种自动化的端到端机器学习服务,旨在为具有丰富经验的开发人员提供服务。

    AiTechYun
  • 基于单层决策树的AdaBoost算法

    Boosting,也称为增强学习或提升法,是一种重要的集成学习技术,能够将预测精度仅比随机猜度略高的弱学习器增强为预测精度高的强学习器,这在直接构造强学习器非常...

    用户6021899
  • 6个评估标准教你如何选择RPA机器人

    2019年被定为“RPA机器人流程自动化”元年,当然也有人说2018年是元年,这里我就不做过多的争论了。但是对于大多数公司来说RPA(机器人流程自动化)仍然是一...

    RPA小葵
  • ​特征工程系列:特征预处理(上)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    MachineLP
  • GBDT梯度提升树

    GBDT的全称是Gradient boosting decision tree,它是通过拟合负梯度Gradient boosting和决策回归树decision...

    opprash

扫码关注云+社区

领取腾讯云代金券