再次檢視情感分類

使用 Keras 建立語言模型的循環神經網路(RNN)

David Cecchini

Data Scientist

先前結果

我們的初始模型表現不佳。

model = Sequential()
model.add(SimpleRNN(units=16, input_shape=(None, 1)))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='sgd', metrics=['accuracy'])

model.evaluate(x_test, y_test)
$[0.6991182165145874, 0.495]
使用 Keras 建立語言模型的循環神經網路(RNN)

改進模型

為了提升模型效能,你可以:

  • 加入 embedding 層
  • 增加層數
  • 微調參數
  • 擴充詞彙表大小
  • 接受更長句子並增加記憶單元
使用 Keras 建立語言模型的循環神經網路(RNN)

避免過度擬合

RNN 模型容易過度擬合

  • 測試不同的 batch size。
  • 加入 Dropout 層。
  • 在 RNN 層加入 dropoutrecurrent_dropout 參數。
# 移除 20% 的輸入以加入雜訊
model.add(Dropout(rate=0.2))

# 分別移除 10% 的輸入與記憶單元 model.add(LSTM(128, dropout=0.1, recurrent_dropout=0.1))
使用 Keras 建立語言模型的循環神經網路(RNN)

補充:卷積層

不在本節範圍:

model.add(Embedding(vocabulary_size, wordvec_dim, ...))
model.add(Conv1D(num_filters=32, kernel_size=3, padding='same'))
model.add(MaxPooling1D(pool_size=2))
  • 卷積層會在 embedding 向量上做特徵選擇
  • 在許多 NLP 問題上可達到 SOTA 水準
使用 Keras 建立語言模型的循環神經網路(RNN)

模型範例

model = Sequential()
model.add(Embedding(  vocabulary_size, wordvec_dim, trainable=True,
                      embeddings_initializer=Constant(glove_matrix), 
                      input_length=max_text_len, name="Embedding"))

model.add(Dense(wordvec_dim, activation='relu', name="Dense1"))
model.add(Dropout(rate=0.25)) model.add(LSTM(64, return_sequences=True, dropout=0.15, name="LSTM"))
model.add(GRU(64, return_sequences=False, dropout=0.15, name="GRU"))
model.add(Dense(64, name="Dense2")) model.add(Dropout(rate=0.25)) model.add(Dense(32, name="Dense3"))
model.add(Dense(1, activation='sigmoid', name="Output"))
使用 Keras 建立語言模型的循環神經網路(RNN)

一起來練習吧!

使用 Keras 建立語言模型的循環神經網路(RNN)

Preparing Video For Download...