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这个词出现了三次,但每次出现都有一个不同的词跟随着。该模型需要一种区分用途的方法。递归神经网络是一类神经网络,通过在处理单词时将每个单词作为附加输入处理后使用模型的状态来解决该问题。

Figure 1 The inputs and outputs of a recurrent neural network over three input words

图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 MemoryGated Recurrent networks,可自动创建输入和输出功能。

该网络有两个输入:输入字和状态输入,这是可选的。单词是一个String,名为stateIn的状态是一个512 Double值的一维MLMultiArray。状态输入是可选的,因为序列的开头没有先前状态。

网络有三个输出:最可能的下一个词,可能的下一个词与其概率配对的词典,以及512个Double值的一维MLMultiArray,名为stateOut,表示处理输入后网络的状态。

MLMultiArray输出表示网络的状态,即其内部节点的激活级别。为了使网络“记住”已处理的输入序列,先前的输出状态必须伴随下一个输入。

实际上,您可能会遇到具有默认状态功能名称的图层。例如,Long Short-Term Memory网络将为输入提供名为lstm_h_inlstm_c_in的默认状态参数,为输出提供lstm_h_outlsth_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中所述),开始对新句子进行预测。

后记

本篇主要讲述了用一系列输入进行预测,感兴趣的给个赞或者关注~~~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 198,154评论 5 464
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,252评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 145,107评论 0 327
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,985评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,905评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,256评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,978评论 3 388
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,611评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,891评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,910评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,736评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,516评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,995评论 3 301
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,132评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,447评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,034评论 2 343
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,242评论 2 339

推荐阅读更多精彩内容