DeepPavlov配置檔案
配置檔案
chainer 配置
{
"chainer": {
"in": ["x"],
"in_y": ["y"],
"pipe": [
...
],
"out": ["y_predicted"]
}
}
chainer 是 DeepPavlov 的核心概念,它從異構元件(基於規則/機器學習/深度學習)中建立了一個管道,作為一個整體從管道進行訓練和推斷。
管道中的每個元件的輸入和輸出都是名稱的陣列,例如:
"in": ["tokens", "features"]
"out": ["token_embeddings" , "features_embeddings"]
可以把一個元件的輸出作為另一個元件的輸入:
{
"class": "deeppavlov.models.preprocessors.str_lower:StrLower",
"in": ["x"],
"out": ["x_lower"]
},
{
"name": "nltk_tokenizer",
"in": ["x_lower"],
"out": ["x_tokens"]
}
管道中的每個元件都必須要執行 _call_() 方法,必須有 name 引數或者 class 引數。
- name 引數相當於是這個元件的註冊代號
- class
它也可以有其他的引數,也就是 _init_() 方法中的引數,當一個例項初始化的時候,配置中的值可以改寫 _init_() 中引數的預設值。
通過id和ref引數,可以重用管道中的元件來處理資料的不同部分: (並不知道有啥用…重用它幹啥,為啥不直接再新建一個元件?)
{
"name": "nltk_tokenizer",
"id": "tokenizer",
"in": ["x_lower"],
"out": ["x_tokens"]
},
{
"ref": "tokenizer",
"in": ["y" ],
"out": ["y_tokens"]
},
in : 推理過程中輸入的資料欄位列表,是一個字典,包含text(使用者說的話),intents(包含slots:語句裡的特徵,act:反饋的動作),prev_rep_act之前反饋的動作(迴圈神經網路需要)
{
'text': 'traditional',
'intents':
[
{
'slots':
[
['food', 'traditional']
],
'act': 'inform'
}
],
'prev_resp_act': 'welcomemsg'
}
in_y : 也是一個字典,包含text(提供服務的人說的話),act(回覆的話的型別)
{
'text': 'Hello, welcome to the Cambridge restaurant system. You can ask for restaurants by area, price range or food type. How may I help you?',
'act': 'welcomemsg'
}
????out : 輸出的話的每個單詞索引
Training – 訓練
對於訓練元件來說,有兩個抽象類:Estimator 和 NNModel
- Estimator:適用於任何沒有批處理或早期停止的資料,因此在管道初始化時就可以完成。 fit() 方法是必須實現的。一個例子就是 Vocab。
- NNModel:需要更復雜的訓練,它只能在監督模式下訓練(而 Estimator 可以在監督和非監督兩種模式下訓練)。這個過程需要好多輪進行週期驗證和日誌記錄。 train_on_batch() 方法是必須實現的。
訓練由 train_model_from_config() 函式觸發。
train 配置
Estimator 型別訓練需要有 fit_on 引數,裡面包含輸入引數名的列表。
NNModel 型別訓練需要有 in_y 引數,裡面包含ground truth回答名字的列表。(在看英文文獻的時候,經常會看到 ground truth 這個詞彙,翻譯的意思是地面實況,放到機器學習裡面,再抽象點可以把它理解為真值、真實的有效值或者是標準的答案。)
例如:
[
{
"id": "classes_vocab",
"name": "default_vocab",
"fit_on": ["y"],
"level": "token",
"save_path": "vocabs/classes.dict",
"load_path": "vocabs/classes.dict"
},
{
"in": ["x"],
"in_y": ["y"],
"out": ["y_predicted"],
"name": "intent_model",
"save_path": "classifiers/intent_cnn",
"load_path": "classifiers/intent_cnn",
"classes_vocab": {
"ref": "classes_vocab"
}
}
]
除了 chainer ,訓練管道的配置應該還有三個元素: dataset_reader , dataset_iterator 和 train 。如下所示:
{
"dataset_reader": {
"name": ...,
...
}
"dataset_iterator": {
"name": ...,
...
},
"chainer": {
...
}
"train": {
...
}
}
簡化版的訓練管道包含兩個元素: dataset 和 train.
- dataset 元素目前可以用來訓練csv和json格式的分類資料。
訓練引數
- epochs —— 訓練NNModel的最大輪數,預設是-1(代表無窮)
- batch_size —— 批量大小
- metrics —— 用於評估模型的註冊的指標列表,列表中的第一個指標用於早期停止
注:早期停止(Early Stop)神經網路中具體的做法如下:
1. 首先將訓練資料劃分為訓練集和驗證集(劃分比例為2:1);
2. 在訓練集上進行訓練,並且在驗證集上獲取測試結果(比如每隔5個epoch測試一下),隨著epoch的增加,如果在驗證集上發現測試誤差上升,則停止訓練;
3. 將停止之後的權重作為網路的最終引數。
Early Stop能夠防止過擬合。 - metric_optimization —— 最優化度量,即最大化(maximize )或最小化(minimize )度量,預設為最大化(maximize )
- validation_patience —— 早期停止前,在一行中有多少次驗證指標沒有改進,預設值為5
- val_every_n_epochs —— 驗證管道的頻率,預設為-1(從不)
- log_every_n_batches,log_every_n_epochs —— 計算訓練資料指標的頻率,預設為-1(從不)
- validate_best,test_best —— 在有效和測試資料上用於推斷儲存的最佳模型的標誌,預設為true
- tensorboard_log_dir —— 在訓練期間編寫日誌度量的路徑。使用tensorboard可以實現視覺化度量圖。
DatasetReader
讀取資料,並以特定的格式返回。一個具體的DatasetReader類應該從這個基類繼承並註冊一個代號:
from deeppavlov.core.common.registry import register
from deeppavlov.core.data.dataset_reader import DatasetReader
@register('dstc2_datasetreader')
class DSTC2DatasetReader(DatasetReader):
DataLearningIterator & DataFittingIterator
DataLearningIterator —— 形成訓練所需的資料集(‘train’,’valid ‘,’test’),並將它們分成批處理。一個例項需要繼承 deeppavlov.data.data_learning_iterator.DataLearningIterator 這個類,並註冊代號。這是個基類,也可以直接使用。
DataFittingIterator —— 對所提供的資料集進行迭代而不需要(‘train’,’valid ‘,’test’)分割,對於不需要訓練的 Estimator 很有用。