LSTM は、長期的な依存関係の問題を解決するために使用されるリカレント ニューラル ネットワークの一種です。中心となるアイデアは、一連のゲート ユニットを介して入力、出力、および内部状態の流れを制御し、それによって RNN における勾配の消失または爆発の問題を効果的に回避することです。このゲート メカニズムにより、LSTM は情報を長期間記憶し、必要に応じて状態を選択的に忘れたり更新したりできるため、長いシーケンス データの処理が向上します。
LSTM の動作原理は、忘却ゲート、入力ゲート、出力ゲートを含む 3 つのゲート制御ユニットを通じて情報の流れと保存を制御することです。
Forgetting Gate: 以前の状態を忘れる必要があるかどうかを制御し、モデルが以前の状態情報を選択的に保持できるようにします。
入力ゲート: 現在の状態における新しい入力情報の割合を制御し、モデルが新しい情報を選択的に追加できるようにします。
出力ゲート: 現在の状態情報の出力を制御し、モデルが状態情報を選択的に出力できるようにします。
たとえば、LSTM を使用して天気に関するテキストを生成するとします。まず、テキストを数値に変換する必要があります。これは、各単語を一意の整数にマッピングすることで実行できます。次に、これらの整数を LSTM にフィードし、次の単語の確率分布を予測できるようにモデルをトレーニングします。最後に、この確率分布を使用して連続テキストを生成できます。
以下は、LSTM を実装してテキストを生成するサンプル コードです:
import numpy as np import sys import io from keras.models import Sequential from keras.layers import Dense, LSTM, Dropout from keras.callbacks import ModelCheckpoint from keras.utils import np_utils # 读取文本文件并将其转换为整数 with io.open('text.txt', encoding='utf-8') as f: text = f.read() chars =list(set(text)) char_to_int = dict((c, i) for i, c in enumerate(chars)) # 将文本分割成固定长度的序列 seq_length = 100 dataX = [] dataY = [] for i in range(0, len(text) - seq_length, 1): seq_in = text[i:i + seq_length] seq_out = text[i + seq_length] dataX.append([char_to_int[char] for char in seq_in]) dataY.append(char_to_int[seq_out]) n_patterns = len(dataX) # 将数据转换为适合LSTM的格式 X = np.reshape(dataX, (n_patterns, seq_length, 1)) X = X / float(len(chars)) y = np_utils.to_categorical(dataY) # 定义LSTM模型 model = Sequential() model.add(LSTM(256, input_shape=(X.shape[1], X.shape[2]), return_sequences=True)) model.add(Dropout(0.2)) model.add(LSTM(256)) model.add(Dropout(0.2)) model.add(Dense(y.shape[1], activation='softmax')) model.compile(loss='categorical_crossentropy', optimizer='adam') # 训练模型 filepath="weights-improvement-{epoch:02d}-{loss:.4f}.hdf5" checkpoint = ModelCheckpoint(filepath, monitor='loss', verbose=1, save_best_only=True, mode='min') callbacks_list = [checkpoint] model.fit(X, y, epochs=20, batch_size=128, callbacks=callbacks_list) # 使用模型生成文本 int_to_char = dict((i, c) for i, c in enumerate(chars)) start = np.random.randint(0, len(dataX)-1) pattern = dataX[start] print("Seed:") print("\"", ''.join([int_to_char[value] for value in pattern]), "\"") for i in range(1000): x = np.reshape(pattern, (1, len(pattern), 1)) x = x / float(len(chars)) prediction = model.predict(x, verbose=0) index = np.argmax(prediction) result = int_to_char[index] seq_in = [int_to_char[value] for value in pattern] sys.stdout.write(result) pattern.append(index) pattern = pattern[1:len(pattern)]
上記のコードでは、まず io ライブラリを通じてテキスト ファイルを読み取り、それぞれをマップします。文字を一意の整数に変換します。次に、テキストを長さ 100 のシーケンスに分割し、これらのシーケンスを LSTM に適した形式に変換します。次に、次の文字の確率分布を計算するための活性化関数としてソフトマックスを使用して、2 つの LSTM 層と全結合層を含むモデルを定義します。最後に、fit メソッドを使用してモデルをトレーニングし、predict メソッドを使用して連続テキストを生成します。
モデルを使用してテキストを生成する場合、まず開始点としてデータセットからシーケンスをランダムに選択します。次に、モデルを使用して次の文字の確率分布を予測し、最も高い確率を持つ文字を次の文字として選択します。次に、シーケンスの最後に文字を追加し、シーケンスの先頭の文字を削除します。1000 文字のテキストが生成されるまで上記の手順を繰り返します。
一般に、LSTM は長期的な依存関係の問題を解決するために特別に設計されたリカレント ニューラル ネットワークの一種です。ゲート ユニットを使用して入力、出力、および内部状態のフローを制御することにより、LSTM はグラデーションの消失または爆発の問題を回避し、連続テキストの生成などのアプリケーションを可能にします。
以上がLSTM を使用して連続テキストを生成する方法と技術の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。