Core ML框架详细解析(九) —— 用一系列输入进行预测(一
版本记录
版本号 | 时间 |
---|---|
V1.0 | 2018.10.16 星期二 |
前言
目前世界上科技界的所有大佬一致认为人工智能是下一代科技革命,苹果作为科技界的巨头,当然也会紧跟新的科技革命的步伐,其中ios API 就新出了一个框架
Core ML
。ML是Machine Learning
的缩写,也就是机器学习,这正是现在很火的一个技术,它也是人工智能最核心的内容。感兴趣的可以看我写的下面几篇。
1. Core ML框架详细解析(一) —— Core ML基本概览
2. Core ML框架详细解析(二) —— 获取模型并集成到APP中
3. Core ML框架详细解析(三) —— 利用Vision和Core ML对图像进行分类
4. Core ML框架详细解析(四) —— 将训练模型转化为Core ML
5. Core ML框架详细解析(五) —— 一个Core ML简单示例(一)
6. Core ML框架详细解析(六) —— 一个Core ML简单示例(二)
7. Core ML框架详细解析(七) —— 减少Core ML应用程序的大小(一)
8. Core ML框架详细解析(八) —— 在用户设备上下载和编译模型(一)
Overview - 概览
将循环神经网络模型集成到处理输入序列中。
一些机器学习问题需要不止一组输入,并且需要随着时间的推移处理一系列输入。 神经网络模型可以处理一系列输入,但需要在输入之间维持神经网络的某些状态。 Core ML提供了一种简单的方法来维护网络状态并处理一系列输入。
Understand the Neural Network Workflow - 了解神经网络工作流程
处理自然语言对于机器学习模型来说是一项艰巨的任务,因为可能的句子数量是无限的,因此无法将所有输入编码到模型中。减少可能输入数量的常用方法是使用字母或单词作为模型的输入,而不是将整个句子作为单个输入处理。然而,该模型需要一种方法来维持状态以“记住”先前在序列中呈现的字母或单词。
考虑一个训练的神经网络模型,以产生莎士比亚戏剧Romeo and Juliet
。神经网络在不使用显式规则的情况下对单词及其相邻单词之间的关系进行编码。在热门行中,"O, Romeo, Romeo, wherefore art thou Romeo?"
Romeo
这个词出现了三次,但每次出现都有一个不同的词跟随着。该模型需要一种区分用途的方法。递归神经网络是一类神经网络,通过在处理单词时将每个单词作为附加输入处理后使用模型的状态来解决该问题。
图1显示了学习Romeo and Juliet
的网络示例工作流程。 要启动短语,提供“O”
和nil
状态作为输入。 预测下一个字,并且网络还为输入“O”
生成其状态的表示,称为f(“O”)
。 下一个输入词“Romeo”
与前一个状态f(“O”)
组合,以创建下一个输入。 鉴于该输入,该模型再次以高概率输出“Romeo”
。
下一个输入词“Romeo”
与前一个输入词相同。 但是,状态输入是不同的。 状态输入现在是f(“O”,“Romeo”)
。 即使先前的输入字是相同的,不同的状态也允许网络输出预测“wherefore”
。
Expose the State of the Model - 公开模型的状态
在Xcode中为您的项目添加基于递归神经网络的模型,以查看作为输入和输出功能公开的神经网络的状态。
Figure 2 An example recurrent neural network that generates the text of Romeo and Juliet图2显示了Xcode中ShakespeareLanguageModel
的视图,该模型具有循环神经网络层,列出了其状态输入和输出功能。其他递归神经网络,如 Long Short-Term Memory
和 Gated Recurrent networks
,可自动创建输入和输出功能。
该网络有两个输入:输入字和状态输入,这是可选的。单词是一个String
,名为stateIn
的状态是一个512 Double
值的一维MLMultiArray。状态输入是可选的,因为序列的开头没有先前状态。
网络有三个输出:最可能的下一个词,可能的下一个词与其概率配对的词典,以及512个Double值的一维MLMultiArray
,名为stateOut
,表示处理输入后网络的状态。
MLMultiArray
输出表示网络的状态,即其内部节点的激活级别。为了使网络“记住”已处理的输入序列,先前的输出状态必须伴随下一个输入。
实际上,您可能会遇到具有默认状态功能名称的图层。例如,Long Short-Term Memory
网络将为输入提供名为lstm_h_in
和lstm_c_in
的默认状态参数,为输出提供lstm_h_out
和lsth_c_out
。 “h”
表示隐藏状态,“c”
表示LSTM
网络使用的单元状态。这些输出状态必须作为输入状态继续运行,以使网络在输入序列中正常工作。
Start a Sequence of Inputs - 启动输入序列
该网络经过训练,可以从一个句子中产生两个提示词,从剧本中产生其余的句子。 通过传入提示中的第一个单词并将nil
作为前一个状态传递,开始使用此模型处理一系列输入。
// Listing 1
Initializing a network by using nil as the first state
// Create the prompt to use as an example
let prompt = ["O", "Romeo"]
// Use the generated input API to create the network's input, with no state
let modelInput = ShakespeareLanguageModelInput(previousWord: prompt[0], stateIn: nil)
// Predict the 2nd word and generate a model state for "O"
var modelOutput = try model.prediction(input: modelInput)
在此示例代码中,由Xcode
生成的ShakespeareLanguageModelInput
类用于存储预测调用的两个输入。
Make Predictions Based on Previous State - 根据以前的状态做出预测
使用提示中的第二个单词和预测中的输出状态作为输入状态创建输入。 将该输入与模型一起使用以生成对句子的第三个单词的预测。
// Listing 2
Predicting the third word by using the second word and the state after processing the first word
// Set up the input for the second word (ignoring the predicted words)
modelInput.previousWord = prompt[1]
// Use the output model state as the input model state for the next word
modelInput.stateIn = modelOutput.stateOut
// Predict the third word
modelOutput = try model.prediction(input: modelInput)
// The third word is now in modelOutput.nextWord
使用前两个字初始化网络时,需要保持输出状态以表示输入序列。 预测的单词和概率被忽略。 它们被忽略,因为第二个单词(Romeo)
来自实际文本而不是模型的预测。
但是,一旦处理了两个单词提示,输出nextWord
就是句子中最可能的第三个单词。 它将用作输入词,以生成句子中的第四个单词。 重复使用输出作为输入以生成句子的其余部分。
// Listing 3
Using the next word prediction as the input word, to generate the rest of the sentence
// Feed the next word and output state back into the network,
// while the predicted word isn't the end of the sentence.
while modelOutput.nextWord != "</s>" {
// Update the inputs from the network's output
modelInput.previousWord = modelOutput.nextWord
modelInput.stateIn = modelOutput.stateOut
// Predict the next word
modelOutput = try model.prediction(input: modelInput)
}
Listing 3
重复了使用预测的单词和状态作为输入单词和状态的过程,直到预测的单词</ s>
。 此网络使用字符串</ s>
表示句子的结尾。
Verify the Output and Reset the Input State - 验证输出并重置输入状态
此时,模型预测了句子的结束。 nextWord
值的序列表示模型对整个句子的预测。 可以将整个预测句子呈现给用户以进行验证或者以编程方式与实际文本进行比较。
使用nil
作为输入状态重置输入内容(如Making Predictions with a Sequence of Inputs
中所述),开始对新句子进行预测。
后记
本篇主要讲述了用一系列输入进行预测,感兴趣的给个赞或者关注~~~