大俠幸會,在下全網(wǎng)同名「算法金」 0 基礎轉 AI 上岸,多個算法賽 Top 「日更萬日,讓更多人享受智能樂趣」 時間拉回 2019 年,有「計算機界諾貝爾獎」之稱圖靈獎獲得者公布,深度學習三巨頭:Yoshua Bengio、Geoffrey Hinton、Yann LeCun 眾望所歸。 圖靈獎為
大俠幸會,在下全網(wǎng)同名「算法金」 0 基礎轉 AI 上岸,多個算法賽 Top 「日更萬日,讓更多人享受智能樂趣」
時間拉回 2019 年,有「計算機界諾貝爾獎」之稱圖靈獎獲得者公布,深度學習三巨頭:Yoshua Bengio、Geoffrey Hinton、Yann LeCun 眾望所歸。
圖靈獎為何不頒給LSTM之父Jürgen Schmidhuber?作為AI界特立獨行的人,Schmidhuber與深度學習三巨頭有過口水戰(zhàn),并現(xiàn)場對質GAN的提出者,可謂得罪了一圈人。
20 世紀 90 年代,長短時記憶(LSTM)方法引入了恒定誤差選擇輪盤和門控的核心思想。三十多年來,LSTM 經(jīng)受住了時間的考驗,并為眾多深度學習的成功案例做出了貢獻。然而,以可并行自注意力為核心 Transformer 橫空出世之后,LSTM 自身所存在的局限性使其風光不再。
當人們都以為 Transformer 在語言模型領域穩(wěn)坐江山的時候,LSTM 又殺回來了 —— 這次,是以 xLSTM 的身份。
5 月 8 日,LSTM 提出者和奠基者 Sepp Hochreiter 在 arXiv 上傳了 xLSTM 的預印本論文。
LSTM:「這次重生,我要奪回 Transformer 拿走的一切! 今天,我們就來 說說 前任 - LSTM
(by Michael Phi)
各位[大俠],歡迎來到 LSTM 的世界。LSTM,全稱 Long Short-Term Memory,是一種特殊的循環(huán)神經(jīng)網(wǎng)絡(RNN),旨在解決 RNN 中的長期依賴問題。它在時間序列預測、自然語言處理等領域有著廣泛的應用。接下去我們從以下幾個方面展開:
LSTM 是一種改進的循環(huán)神經(jīng)網(wǎng)絡(RNN),專門用于解決傳統(tǒng) RNN 中的長期依賴問題。RNN 在處理序列數(shù)據(jù)時,能夠利用前面的信息,但是當序列過長時,信息會逐漸丟失。而 LSTM 通過引入記憶單元(Memory Cell)和門控機制(Gate Mechanisms),有效地解決了這一問題。
LSTM 在許多領域有廣泛的應用,包括但不限于:
LSTM 的設計使其能夠有效地捕捉和利用長期依賴關系,顯著提高了序列數(shù)據(jù)處理的性能和效果。
接下來我們看一下 LSTM 的數(shù)學表達式。LSTM 包含三個門:輸入門、遺忘門和輸出門。每個門都有自己的權重和偏置,用于控制信息的流動。
讓我們通過一個圖示來直觀地理解 LSTM 的工作原理。下圖展示了 LSTM 單元的內部結構:
在圖中可以看到,輸入門、遺忘門和輸出門共同作用于記憶單元,控制信息的存儲和傳遞。
通過這種門控機制,LSTM 能夠有效地記住長時間跨度的信息,從而在處理序列數(shù)據(jù)時表現(xiàn)出色。
現(xiàn)在我們來看看如何在 Python 中實現(xiàn) LSTM。我們將使用 Keras 這個高層次神經(jīng)網(wǎng)絡庫來進行實現(xiàn)。首先,我們需要準備數(shù)據(jù)集,這里我們自己造一個結合武俠元素的數(shù)據(jù)集。
import numpy as np
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers import LSTM, Dense
from keras.preprocessing.sequence import pad_sequences
# 生成武俠元素的數(shù)據(jù)集
def generate_data(num_sequences, sequence_length):
data = []
for _ in range(num_sequences):
sequence = np.random.choice(['少林', '武當', '峨眉', '華山', '昆侖'], size=sequence_length)
data.append(sequence)
return data
# 將文本數(shù)據(jù)轉換為數(shù)字
def text_to_numeric(data):
mapping = {'少林': 0, '武當': 1, '峨眉': 2, '華山': 3, '昆侖': 4}
numeric_data = []
for sequence in data:
numeric_data.append([mapping[item] for item in sequence])
return numeric_data
# 數(shù)據(jù)集生成
data = generate_data(1000, 10)
numeric_data = text_to_numeric(data)
# 填充序列
X = pad_sequences(numeric_data, maxlen=10)
y = np.random.rand(1000, 1) # 隨機生成一些標簽
# 構建 LSTM 模型
model = Sequential()
model.add(LSTM(50, input_shape=(10, 1)))
model.add(Dense(1))
model.compile(loss='mse', optimizer='adam')
# 訓練模型
model.fit(X, y, epochs=10, batch_size=32)
# 可視化訓練結果
loss = model.history.history['loss']
plt.plot(loss)
plt.title('Model Loss')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.show()
在基礎實現(xiàn)的基礎上,我們可以進一步優(yōu)化 LSTM 模型,例如增加層數(shù)、調整超參數(shù)等。
推薦閱讀往期文章:
詳解過擬合和欠擬合!
機器學習 10 大最優(yōu)化算法全面總結
在這一部分,我們將展示如何使用 LSTM 進行文本生成。我們將繼續(xù)使用武俠元素的數(shù)據(jù)集,通過訓練 LSTM 來生成類似風格的文本。
import numpy as np
from keras.models import Sequential
from keras.layers import LSTM, Dense, Embedding
from keras.preprocessing.text import Tokenizer
from keras.preprocessing.sequence import pad_sequences
# 生成武俠文本數(shù)據(jù)集
texts = [
"少林武當峨眉華山昆侖",
"武當少林昆侖華山峨眉",
"峨眉少林華山昆侖武當",
"昆侖峨眉少林武當華山",
"華山昆侖峨眉少林武當"
]
# 創(chuàng)建文本 Tokenizer
tokenizer = Tokenizer(char_level=True)
tokenizer.fit_on_texts(texts)
sequences = tokenizer.texts_to_sequences(texts)
vocab_size = len(tokenizer.word_index) + 1
# 準備數(shù)據(jù)
X, y = [], []
for sequence in sequences:
for i in range(1, len(sequence)):
X.append(sequence[:i])
y.append(sequence[i])
X = pad_sequences(X, maxlen=10)
y = np.array(y)
# 構建 LSTM 模型
model = Sequential()
model.add(Embedding(vocab_size, 50, input_length=10))
model.add(LSTM(100))
model.add(Dense(vocab_size, activation='softmax'))
model.compile(loss='sparse_categorical_crossentropy', optimizer='adam')
# 訓練模型
model.fit(X, y, epochs=200, verbose=2)
# 文本生成函數(shù)
def generate_text(model, tokenizer, seed_text, n_chars):
result = seed_text
for _ in range(n_chars):
encoded = tokenizer.texts_to_sequences([seed_text])[0]
encoded = pad_sequences([encoded], maxlen=10, truncating='pre')
predicted = np.argmax(model.predict(encoded), axis=-1)
out_char = tokenizer.index_word[predicted[0]]
seed_text += out_char
result += out_char
return result
# 生成新文本
seed_text = "少林"
generated_text = generate_text(model, tokenizer, seed_text, 20)
print(generated_text)
在這個示例中,我們生成了一些武俠風格的文本。通過訓練 LSTM 模型,我們可以生成類似風格的新文本,展示了 LSTM 在自然語言處理中的能力。
在本例中,我們將使用 LSTM 進行時間序列預測,例如預測未來的天氣狀況。我們會先創(chuàng)建一個模擬的時間序列數(shù)據(jù)集,然后訓練 LSTM 模型進行預測。
import numpy as np
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers import LSTM, Dense
# 生成模擬時間序列數(shù)據(jù)
np.random.seed(7)
data = np.sin(np.linspace(0, 50, 500)) + np.random.normal(0, 0.1, 500)
sequence_length = 10
# 準備數(shù)據(jù)
X = []
y = []
for i in range(len(data) - sequence_length):
X.append(data[i:i+sequence_length])
y.append(data[i+sequence_length])
X = np.array(X)
y = np.array(y)
# 調整數(shù)據(jù)形狀
X = np.reshape(X, (X.shape[0], X.shape[1], 1))
# 構建 LSTM 模型
model = Sequential()
model.add(LSTM(50, input_shape=(sequence_length, 1)))
model.add(Dense(1))
model.compile(loss='mse', optimizer='adam')
# 訓練模型
model.fit(X, y, epochs=20, batch_size=32, verbose=2)
# 預測結果
predicted = model.predict(X)
# 可視化結果
plt.plot(data, label='真實數(shù)據(jù)')
plt.plot(np.arange(sequence_length, sequence_length + len(predicted)), predicted, label='預測數(shù)據(jù)')
plt.legend()
plt.show()
在這個例子中,我們使用 LSTM 模型預測未來的時間序列值。可以看到,通過訓練 LSTM 模型,我們可以較為準確地預測未來的值。
在本文中,我們詳細探討了 LSTM 的定義、基本概念、核心原理、實現(xiàn)方法以及實際應用案例。
- 科研為國分憂,創(chuàng)新與民造福 -
日更時間緊任務急,難免有疏漏之處,還請大俠海涵 內容僅供學習交流之用,部分素材來自網(wǎng)絡,侵聯(lián)刪
如過覺得內容有價值,煩請大俠多多 分享、在看、點贊,助力算法金又猛又持久、很黃很 BL 的日更下去;
同時邀請大俠 關注、星標 算法金,圍觀日更萬日,助你功力大增、笑傲江湖
本站所有軟件,都由網(wǎng)友上傳,如有侵犯你的版權,請發(fā)郵件[email protected]
湘ICP備2022002427號-10 湘公網(wǎng)安備:43070202000427號© 2013~2025 haote.com 好特網(wǎng)