1. 程式人生 > >DeepPavlov配置檔案

DeepPavlov配置檔案

配置檔案

chainer 配置

{
  "chainer": {
    "in": ["x"],
    "in_y": ["y"],
    "pipe": [
      ...
    ],
    "out": ["y_predicted"]
  }
}

chainerDeepPavlov 的核心概念,它從異構元件(基於規則/機器學習/深度學習)中建立了一個管道,作為一個整體從管道進行訓練和推斷。
管道中的每個元件的輸入和輸出都是名稱的陣列,例如:

"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

引數的格式:module_name:ClassName

它也可以有其他的引數,也就是 _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 – 訓練

對於訓練元件來說,有兩個抽象類:EstimatorNNModel
- 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_iteratortrain 。如下所示:

{
  "dataset_reader": {
    "name": ...,
    ...
  }
  "dataset_iterator": {
    "name": ...,
    ...
  },
  "chainer": {
    ...
  }
  "train": {
    ...
  }
}

簡化版的訓練管道包含兩個元素: datasettrain.
- 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_batcheslog_every_n_epochs —— 計算訓練資料指標的頻率,預設為-1(從不)
  • validate_besttest_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 很有用。