Core ML框架詳細解析(九) —— 用一系列輸入進行預測(一)

版本記錄

版本號 時間
V1.0 2018.10.16 星期二

前言

目前世界上科技界的所有大佬一致認為人工智能是下一代科技革命,蘋果作為科技界的巨頭,當然也會緊跟新的科技革命的步伐,其中ios API 就新出了一個框架Core ML。ML是Machine Learning的縮寫,也就是機器學習,這正是現(xiàn)在很火的一個技術,它也是人工智能最核心的內容。感興趣的可以看我寫的下面幾篇。
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 - 概覽

將循環(huán)神經網絡模型集成到處理輸入序列中。

一些機器學習問題需要不止一組輸入,并且需要隨著時間的推移處理一系列輸入。 神經網絡模型可以處理一系列輸入,但需要在輸入之間維持神經網絡的某些狀態(tài)。 Core ML提供了一種簡單的方法來維護網絡狀態(tài)并處理一系列輸入。


Understand the Neural Network Workflow - 了解神經網絡工作流程

處理自然語言對于機器學習模型來說是一項艱巨的任務,因為可能的句子數(shù)量是無限的,因此無法將所有輸入編碼到模型中。減少可能輸入數(shù)量的常用方法是使用字母或單詞作為模型的輸入,而不是將整個句子作為單個輸入處理。然而,該模型需要一種方法來維持狀態(tài)以“記住”先前在序列中呈現(xiàn)的字母或單詞。

考慮一個訓練的神經網絡模型,以產生莎士比亞戲劇Romeo and Juliet。神經網絡在不使用顯式規(guī)則的情況下對單詞及其相鄰單詞之間的關系進行編碼。在熱門行中,"O, Romeo, Romeo, wherefore art thou Romeo?" Romeo這個詞出現(xiàn)了三次,但每次出現(xiàn)都有一個不同的詞跟隨著。該模型需要一種區(qū)分用途的方法。遞歸神經網絡是一類神經網絡,通過在處理單詞時將每個單詞作為附加輸入處理后使用模型的狀態(tài)來解決該問題。

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

圖1顯示了學習Romeo and Juliet的網絡示例工作流程。 要啟動短語,提供“O”nil狀態(tài)作為輸入。 預測下一個字,并且網絡還為輸入“O”生成其狀態(tài)的表示,稱為f(“O”)。 下一個輸入詞“Romeo”與前一個狀態(tài)f(“O”)組合,以創(chuàng)建下一個輸入。 鑒于該輸入,該模型再次以高概率輸出“Romeo”。

下一個輸入詞“Romeo”與前一個輸入詞相同。 但是,狀態(tài)輸入是不同的。 狀態(tài)輸入現(xiàn)在是f(“O”,“Romeo”)。 即使先前的輸入字是相同的,不同的狀態(tài)也允許網絡輸出預測“wherefore”。


Expose the State of the Model - 公開模型的狀態(tài)

在Xcode中為您的項目添加基于遞歸神經網絡的模型,以查看作為輸入和輸出功能公開的神經網絡的狀態(tài)。

Figure 2 An example recurrent neural network that generates the text of Romeo and Juliet

圖2顯示了Xcode中ShakespeareLanguageModel的視圖,該模型具有循環(huán)神經網絡層,列出了其狀態(tài)輸入和輸出功能。其他遞歸神經網絡,如 Long Short-Term MemoryGated Recurrent networks,可自動創(chuàng)建輸入和輸出功能。

該網絡有兩個輸入:輸入字和狀態(tài)輸入,這是可選的。單詞是一個String,名為stateIn的狀態(tài)是一個512 Double值的一維MLMultiArray。狀態(tài)輸入是可選的,因為序列的開頭沒有先前狀態(tài)。

網絡有三個輸出:最可能的下一個詞,可能的下一個詞與其概率配對的詞典,以及512個Double值的一維MLMultiArray,名為stateOut,表示處理輸入后網絡的狀態(tài)。

MLMultiArray輸出表示網絡的狀態(tài),即其內部節(jié)點的激活級別。為了使網絡“記住”已處理的輸入序列,先前的輸出狀態(tài)必須伴隨下一個輸入。

實際上,您可能會遇到具有默認狀態(tài)功能名稱的圖層。例如,Long Short-Term Memory網絡將為輸入提供名為lstm_h_inlstm_c_in的默認狀態(tài)參數(shù),為輸出提供lstm_h_outlsth_c_out。 “h”表示隱藏狀態(tài),“c”表示LSTM網絡使用的單元狀態(tài)。這些輸出狀態(tài)必須作為輸入狀態(tài)繼續(xù)運行,以使網絡在輸入序列中正常工作。


Start a Sequence of Inputs - 啟動輸入序列

該網絡經過訓練,可以從一個句子中產生兩個提示詞,從劇本中產生其余的句子。 通過傳入提示中的第一個單詞并將nil作為前一個狀態(tài)傳遞,開始使用此模型處理一系列輸入。

// 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 - 根據(jù)以前的狀態(tài)做出預測

使用提示中的第二個單詞和預測中的輸出狀態(tài)作為輸入狀態(tài)創(chuàng)建輸入。 將該輸入與模型一起使用以生成對句子的第三個單詞的預測。

// 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

使用前兩個字初始化網絡時,需要保持輸出狀態(tài)以表示輸入序列。 預測的單詞和概率被忽略。 它們被忽略,因為第二個單詞(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重復了使用預測的單詞和狀態(tài)作為輸入單詞和狀態(tài)的過程,直到預測的單詞</ s>。 此網絡使用字符串</ s>表示句子的結尾。


Verify the Output and Reset the Input State - 驗證輸出并重置輸入狀態(tài)

此時,模型預測了句子的結束。 nextWord值的序列表示模型對整個句子的預測。 可以將整個預測句子呈現(xiàn)給用戶以進行驗證或者以編程方式與實際文本進行比較。

使用nil作為輸入狀態(tài)重置輸入內容(如Making Predictions with a Sequence of Inputs中所述),開始對新句子進行預測。

后記

本篇主要講述了用一系列輸入進行預測,感興趣的給個贊或者關注~~~

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容