0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

RNN基本原理和RNN種類與實(shí)例

lviY_AI_shequ ? 來源:未知 ? 作者:李倩 ? 2018-07-27 17:22 ? 次閱讀

之前提到的CNN模型主要用到人類的視覺中樞,但其有一劣勢(shì),無論是人類的視覺神經(jīng)還是聽覺神經(jīng),所接受到的都是一個(gè)連續(xù)的序列,使用CNN相當(dāng)于割裂了前后的聯(lián)系。從而誕生了專門為處理序列的Recurrent Neural Network(RNN),每一個(gè)神經(jīng)元除了當(dāng)前信息的輸入外,還有之前產(chǎn)生的記憶信息,保留序列依賴型。

一、RNN基本原理

如下圖所示有兩種表示方法,每張圖片左邊是RNN的神經(jīng)元(稱為memory cell),右邊是按時(shí)間軸展開后的情況。每次輸入兩個(gè)信息輸出兩個(gè)信息,每輪處理hidden state。把同樣神經(jīng)元在時(shí)間上展開處理,比CNN更加節(jié)省參數(shù),是一個(gè)相當(dāng)高效的表示方法。

可參考如下公式表示,最后簡(jiǎn)化后的形式同一般神經(jīng)元相同,輸入信息乘權(quán)重加偏值:

由于t狀態(tài)的t由t-1時(shí)候決定,因而具有記憶功能,也叫作memory cell(或cell)

隱狀態(tài)可由如下表示:

隱狀態(tài)是當(dāng)前t時(shí)刻的狀態(tài),也由t-1時(shí)刻決定,簡(jiǎn)單情況下,hidden state等同于output(y),但大多較為復(fù)雜的cell中,它們并不相同。如下圖所示:

二、RNN種類:

1. sequence-to-sequence:輸入輸出都是一個(gè)序列。例如股票預(yù)測(cè)中的RNN,輸入是前N天價(jià)格,輸出明天的股市價(jià)格。

2. sequence-to-vector:輸入是一個(gè)序列,輸出單一向量。

例如,輸入一個(gè)電影評(píng)價(jià)序列,輸出一個(gè)分?jǐn)?shù)表示情感趨勢(shì)(喜歡還是討厭)。

3. vector-to-sequence:輸入單一向量,輸出一個(gè)序列。

4.Encoder-Decoder:輸入sequence-to-vector,稱作encoder,輸出vector-to-sequence,稱作decoder。

這是一個(gè)delay模型,經(jīng)過一段延遲,即把所有輸入都讀取后,在decoder中獲取輸入并輸出一個(gè)序列。這個(gè)模型在機(jī)器翻譯中使用較廣泛,源語言輸在入放入encoder,濃縮在狀態(tài)信息中,生成目標(biāo)語言時(shí),可以生成一個(gè)不長(zhǎng)度的目標(biāo)語言序列。

三、RNN實(shí)例

1.手動(dòng)實(shí)現(xiàn)

以下是一個(gè)手動(dòng)實(shí)現(xiàn)RNN的實(shí)例

n_inputs = 3 # hidden state n_neurons = 5 X0 = tf.placeholder(tf.float32, [None, n_inputs]) X1 = tf.placeholder(tf.float32, [None, n_inputs]) # 由于Wx要和X相乘,故低維是n_inputs Wx = tf.Variable(tf.random_normal(shape=[n_inputs, n_neurons],dtype=tf.float32)) # 低維,高維都是n_neurons,為了使得輸出也是hidden state的深度 # 這樣下一次才可以繼續(xù)運(yùn)算 Wy = tf.Variable(tf.random_normal(shape=[n_neurons,n_neurons],dtype=tf.float32)) b = tf.Variable(tf.zeros([1, n_neurons], dtype=tf.float32)) # Y0初始化為0,初始時(shí)沒有記憶 Y0 = tf.tanh(tf.matmul(X0, Wx) + b) # 把上一輪輸出Y0也作為輸入 Y1 = tf.tanh(tf.matmul(Y0, Wy) + tf.matmul(X1, Wx) + b) init = tf.global_variables_initializer() import numpy as np X0_batch = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 0, 1]]) # t = 0 X1_batch = np.array([[9, 8, 7], [0, 0, 0], [6, 5, 4], [3, 2, 1]]) # t = 1 with tf.Session() as sess: init.run() Y0_val, Y1_val = sess.run([Y0, Y1], feed_dict={X0: X0_batch, X1: X1_batch}) # Y0,Y1都是4*5大小,4是mini-batch數(shù)目,5是輸出神經(jīng)元個(gè)數(shù)

TensorFlow函數(shù)集成后實(shí)現(xiàn)

2.static unrolling through time

static_rnn()是使用鏈?zhǔn)絚ells實(shí)現(xiàn)一個(gè)按時(shí)間軸展開的RNN

# 這種和上面那種手動(dòng)實(shí)現(xiàn)的效果相同 n_inputs = 3 n_neurons = 5 X0 = tf.placeholder(tf.float32, [None, n_inputs]) X1 = tf.placeholder(tf.float32, [None, n_inputs]) basic_cell = tf.contrib.rnn.BasicRNNCell(num_units=n_neurons) output_seqs, states = tf.contrib.rnn.static_rnn(basic_cell, [X0, X1], dtype=tf.float32) Y0, Y1 = output_seqs # run部分 init = tf.global_variables_initializer() X0_batch = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 0, 1]]) X1_batch = np.array([[9, 8, 7], [0, 0, 0], [6, 5, 4], [3, 2, 1]]) with tf.Session() as sess: init.run() Y0_val, Y1_val = sess.run([Y0, Y1], feed_dict={X0: X0_batch, X1: X1_batch})

packing sequence

n_steps = 2 n_inputs = 3 n_neurons = 5 # 輸入是一個(gè)三維tensor,none是mini-batch大小不限,n_steps是序列長(zhǎng)度 X = tf.placeholder(tf.float32, [None, n_steps, n_inputs]) # 把一個(gè)高維度n的tensor展開成一個(gè)n-1維,降維,這里是3位降到2維列表 # unstack之前要做一個(gè)1,2維轉(zhuǎn)置,相當(dāng)于構(gòu)造了n_steps個(gè)數(shù)的列表 X_seqs = tf.unstack(tf.transpose(X, perm=[1, 0, 2])) basic_cell = tf.contrib.rnn.BasicRNNCell(num_units=n_neurons) # states是最新狀態(tài) output_seqs, states = tf.contrib.rnn.static_rnn( basic_cell, X_seqs, dtype=tf.float32) # 再做一個(gè)轉(zhuǎn)置,和輸入對(duì)應(yīng) outputs = tf.transpose(tf.stack(output_seqs), perm=[1, 0, 2]) # 輸入大小4*2*3 X_batch = np.array([ # t = 0 t = 1 [[0, 1, 2], [9, 8, 7]], # instance 0 [[3, 4, 5], [0, 0, 0]], # instance 1 [[6, 7, 8], [6, 5, 4]], # instance 2 [[9, 0, 1], [3, 2, 1]], # instance 3 ]) with tf.Session() as sess: init.run() outputs_val = outputs.eval(feed_dict={X: X_batch}) # output_val是一個(gè)4*2*5,僅輸出維度神經(jīng)元個(gè)數(shù)改

3. dynamic RNN

本身支持高維tensor輸入,內(nèi)嵌一個(gè)循環(huán)運(yùn)行足夠多次數(shù)的cell,不需要unstack步驟。

這個(gè)內(nèi)嵌循環(huán)while_loop()在前向傳播中將每次迭代的tensor值存儲(chǔ)下來,以便于反向傳播過程中使用其計(jì)算梯度值。

X = tf.placeholder(tf.float32, [None, n_steps, n_inputs]) # 動(dòng)態(tài)RNN內(nèi)部封裝一個(gè)循環(huán) # 根據(jù)輸入,動(dòng)態(tài)決定自己需要展開幾次 basic_cell = tf.contrib.rnn.BasicRNNCell(num_units=n_neurons) outputs, states = tf.nn.dynamic_rnn(basic_cell, X, dtype=tf.float32)

dynamicRNN可以動(dòng)態(tài)規(guī)定輸入大?。ň拖窬渥虞斎耄?/p>

n_steps = 2 n_inputs = 3 n_neurons = 5 X = tf.placeholder(tf.float32, [None, n_steps, n_inputs]) basic_cell = tf.contrib.rnn.BasicRNNCell(num_units=n_neurons) seq_length = tf.placeholder(tf.int32, [None]) outputs, states = tf.nn.dynamic_rnn(basic_cell, X, dtype=tf.float32, sequence_length=seq_length) init = tf.global_variables_initializer() # X_batch的大小4*2*3 X_batch = np.array([ # step 0 step 1 [[0, 1, 2], [9, 8, 7]], # instance 1 [[3, 4, 5], [0, 0, 0]], # instance 2 (padded with zero vectors) [[6, 7, 8], [6, 5, 4]], # instance 3 [[9, 0, 1], [3, 2, 1]], # instance 4 ]) # 這里設(shè)置sequence大小,一共4個(gè)batch,第二維上只取第一個(gè) seq_length_batch = np.array([2, 1, 2, 2]) with tf.Session() as sess: init.run() outputs_val, states_val = sess.run( [outputs, states], feed_dict={X: X_batch, seq_length: seq_length_batch})

如果事先不知道輸出序列的長(zhǎng)度,就需要定義一個(gè)end-of-sequence token(eos token),無論是課上還是網(wǎng)上相關(guān)信息都很少,這里就不展開了。。

四、RNN訓(xùn)練

1. 擬合分類

RNN比較難以訓(xùn)練,單是如下圖的節(jié)點(diǎn)中,cost function就包含y2,y3,y4三個(gè)輸出,往回回溯。

以下MINIST中使用150個(gè)RNN神經(jīng)元,最后加一個(gè)全連接層,得到10個(gè)神經(jīng)元的輸出(分別對(duì)應(yīng)0-9),最后看對(duì)應(yīng)在

rom tensorflow.contrib.layers import fully_connected n_steps = 28 n_inputs = 28 n_neurons = 150 n_outputs = 10 learning_rate = 0.001 X = tf.placeholder(tf.float32, [None, n_steps, n_inputs]) # 一維輸出 y = tf.placeholder(tf.int32, [None]) # 使用最簡(jiǎn)單的basicRNNcell basic_cell = tf.contrib.rnn.BasicRNNCell(num_units=n_neurons) #使用dynamic_rnn outputs, states = tf.nn.dynamic_rnn(basic_cell, X, dtype=tf.float32) # 原始輸出 logits = fully_connected(states, n_outputs, activation_fn=None) # 計(jì)算和真實(shí)的交叉熵 xentropy = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y, logits=logits) loss = tf.reduce_mean(xentropy) # 使用AdamOptimizer optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate) training_op = optimizer.minimize(loss) # 計(jì)算準(zhǔn)確率,只有等于y才是對(duì)的,其他都錯(cuò) correct = tf.nn.in_top_k(logits, y, 1) accuracy = tf.reduce_mean(tf.cast(correct, tf.float32)) init = tf.global_variables_initializer() from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets("/tmp/data/") # 轉(zhuǎn)換到合理的輸入shape X_test = mnist.test.images.reshape((-1, n_steps, n_inputs)) y_test = mnist.test.labels # run100遍,每次處理150個(gè)輸入 n_epochs = 100 batch_size = 150 # 開始循環(huán) with tf.Session() as sess: init.run() for epoch in range(n_epochs): for iteration in range(mnist.train.num_examples // batch_size): # 讀入數(shù)據(jù)并reshape X_batch, y_batch = mnist.train.next_batch(batch_size) X_batch = X_batch.reshape((-1, n_steps, n_inputs)) # X大寫,y小寫 sess.run(training_op, feed_dict={X: X_batch, y: y_batch}) acc_train = accuracy.eval(feed_dict={X: X_batch, y: y_batch}) acc_test = accuracy.eval(feed_dict={X: X_test, y: y_test}) # 每次打印一下當(dāng)前信息 print(epoch, "Train accuracy:", acc_train, "Test accuracy:", acc_test)

以下,只用了150個(gè)參數(shù),做了單層。就可以達(dá)到非常高的效果,可以看出rnn效果非常不錯(cuò)

序列預(yù)測(cè),前20個(gè)狀態(tài)作為輸入,則第2個(gè)到21個(gè)作為輸出,作為訓(xùn)練集

# 輸入x0-x19 n_steps = 20 # 只預(yù)測(cè)一個(gè)值 n_inputs = 1 # rnn有100個(gè) n_neurons = 100 n_outputs = 1 # none表示min_batch大小這里任意 X = tf.placeholder(tf.float32, [None, n_steps, n_inputs]) y = tf.placeholder(tf.float32, [None, n_steps, n_outputs]) cell = tf.contrib.rnn.BasicRNNCell(num_units=n_neurons, activation=tf.nn.relu) outputs, states = tf.nn.dynamic_rnn(cell, X, dtype=tf.float32)

如上代碼中,每次輸出的vector都是100維的,加入一個(gè)output rejections后,使得每次只輸出1個(gè)值

output rejection實(shí)現(xiàn)代碼如下

# 設(shè)置輸出為上面設(shè)定的n_outputs大小 cell = tf.contrib.rnn.OutputProjectionWrapper( tf.contrib.rnn.BasicRNNCell(num_units=n_neurons, activation=tf.nn.relu), output_size=n_outputs) learning_rate = 0.001 loss = tf.reduce_mean(tf.square(outputs - y)) optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate) training_op = optimizer.minimize(loss) init = tf.global_variables_initializer() # 開始訓(xùn)練 n_iterations = 10000 batch_size = 50 with tf.Session() as sess: init.run() for iteration in range(n_iterations): X_batch, y_batch = [...] # fetch the next training batch sess.run(training_op, feed_dict={X: X_batch, y: y_batch}) if iteration % 100 == 0: mse = loss.eval(feed_dict={X: X_batch, y: y_batch}) print(iteration, "\tMSE:", mse)

2.預(yù)測(cè)

當(dāng)一個(gè)RNN訓(xùn)練好后,它就可以生成很多新的東西。RNN的強(qiáng)大的生成能力非常有魅力,用很多曲子去訓(xùn)練它,它就可以生成新的曲子,用很多文章訓(xùn)練它,他就可以生成新的文章。如果可以訓(xùn)練出功能非常強(qiáng)的RNN模型,就有可能代替人的工作。

with tf.Session() as sess: # 導(dǎo)入訓(xùn)練好的模型 saver.restore(sess, "./my_time_series_model") # 生成新的曲線 sequence = [0.] * n_steps for iteration in range(300): X_batch = np.array(sequence[-n_steps:]).reshape(1, n_steps, 1) y_pred = sess.run(outputs, feed_dict={X: X_batch}) sequence.append(y_pred[0, -1, 0])

RNN也可以不斷疊加,形成很深的網(wǎng)絡(luò),如下圖所示,每一層輸出都反饋到當(dāng)前位置的輸入,時(shí)間軸展開后,如右邊所示。

n_inputs = 2 n_steps = 5 X = tf.placeholder(tf.float32, [None, n_steps, n_inputs]) n_neurons = 100 n_layers = 3 # 做了3層rnn # 模型不是越復(fù)雜越好,越復(fù)雜所需數(shù)據(jù)量越大,否則會(huì)有過擬合的風(fēng)險(xiǎn) # 可以加dropout來控制 layers = [tf.contrib.rnn.BasicRNNCell(num_units=n_neurons) for layer in range(n_layers)] multi_layer_cell = tf.contrib.rnn.MultiRNNCell(layers) outputs, states = tf.nn.dynamic_rnn(multi_layer_cell, X, dtype=tf.float32) init = tf.global_variables_initializer() X_batch = np.random.rand(2, n_steps, n_inputs) with tf.Session() as sess: init.run() outputs_val, states_val = sess.run([outputs, states], feed_dict={X: X_batch})

五、困難及優(yōu)化

反向訓(xùn)練時(shí),對(duì)于RNN來說,要橫向往前推,一直往前推到序列開始的地方。當(dāng)序列非常長(zhǎng)時(shí),梯度消失,梯度爆炸都與路徑長(zhǎng)度太長(zhǎng)有關(guān),前面的權(quán)重都基本固定不變,沒有訓(xùn)練效果。

為了解決這個(gè)困難,有了很多更復(fù)雜RNN模型的提出

1.LSTM(Long Short Term Memory)

97年提出,直到深度學(xué)習(xí)提出,使用LSTM做出具體實(shí)事后,才火起來。或許是因?yàn)楝F(xiàn)在有大數(shù)據(jù)的環(huán)境,以及訓(xùn)練能力很強(qiáng)的硬件這些客觀條件得具備,才能真正發(fā)揮LSTM的威力。

它把訓(xùn)練信息分為長(zhǎng)期記憶(c)和短期記憶(h),上面的長(zhǎng)期記憶信息,可以穿到很遠(yuǎn),即使序列長(zhǎng)到1000,也可以向前傳導(dǎo)。

它分了很多個(gè)門(gate),輸出信息趨近于0,門關(guān)閉,趨近于1門打開。i是輸入門控制新輸入加多少到長(zhǎng)期記憶中,f是forget控制是否受長(zhǎng)期記憶的影響,哪些長(zhǎng)期記憶被忘掉,o是輸出門控制哪些長(zhǎng)期記憶可以輸出并作為短期記憶ht傳遞下去,通過這3個(gè)門控制信息的流動(dòng)。

可以保證長(zhǎng)期記憶變換的緩慢,相對(duì)穩(wěn)定,可以對(duì)距離比較遠(yuǎn)的序列影響,ht和ht-1可以看到距離也比較遠(yuǎn),短期記憶ht-1變化明顯。

# TensorFlow中LSTM具體實(shí)現(xiàn) n_steps = 28 n_inputs = 28 n_neurons = 150 n_outputs = 10 n_layers = 3 learning_rate = 0.001 X = tf.placeholder(tf.float32, [None, n_steps, n_inputs]) y = tf.placeholder(tf.int32, [None]) lstm_cells = [tf.contrib.rnn.BasicLSTMCell(num_units=n_neurons) for layer in range(n_layers)] multi_cell = tf.contrib.rnn.MultiRNNCell(lstm_cells) outputs, states = tf.nn.dynamic_rnn(multi_cell, X, dtype=tf.float32) top_layer_h_state = states[-1][1] logits = tf.layers.dense(top_layer_h_state, n_outputs, name="softmax") xentropy = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y, logits=logits) loss = tf.reduce_mean(xentropy, name="loss") optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate) training_op = optimizer.minimize(loss) correct = tf.nn.in_top_k(logits, y, 1) accuracy = tf.reduce_mean(tf.cast(correct, tf.float32)) init = tf.global_variables_initializer()

LSTM還有一點(diǎn)改進(jìn)Peephole Connection

lstm_cell = tf.contrib.rnn.LSTMCell(num_units=n_neurons, use_peepholes=True)

2. GRU(Gated recurrent unit)

GRU是對(duì)LSTM簡(jiǎn)化后的版本,去掉了長(zhǎng)短期記憶的區(qū)分(都是h),減少了幾個(gè)門,2014年提出,從參數(shù)上來說較LSTM簡(jiǎn)單些。

統(tǒng)一用update gate控制原來的i門和f門。z趨近于0就用ht-1來更新,趨近于1就取當(dāng)前輸入。

比LSTM還少一個(gè)矩陣乘法,實(shí)際表現(xiàn)不比LSTM差,也成為現(xiàn)在很多研究者越來越看重的方法。

調(diào)用時(shí),直接調(diào)用GRU cell即可

gru_cell = tf.contrib.rnn.GRUCell(num_units=n_neurons)

六、RNN在NLP(natural language processing)中的應(yīng)用

RNN的輸入原本是one-hot的表示,但這樣會(huì)使得輸入極其稀疏,不好訓(xùn)練。于是將高維空間映射到低維(如100維)空間,用這個(gè)低維嵌入的輸入做訓(xùn)練,非常有效。

Word Embeddings

相同含義的詞在低維空間中距離近,含義差的多的離得遠(yuǎn)。

# 把50000維數(shù)據(jù)映射到150維數(shù)據(jù)空間上 vocabulary_size = 50000 embedding_size = 150 # 做一個(gè)全連接 embeddings = tf.Variable(tf.random_uniform([vocabulary_size, embedding_size], -1.0, 1.0)) train_inputs = tf.placeholder(tf.int32, shape=[None]) # from ids embed = tf.nn.embedding_lookup(embeddings, train_inputs)# to embd

例如下圖所示,把要翻譯的英文句子做輸入,用訓(xùn)練后的狀態(tài)值做輸入,和法語作為訓(xùn)練集的作為decoder輸入。第一位放一個(gè)起始信號(hào),輸出和輸入剛好錯(cuò)一位,最后一位以一個(gè)結(jié)束標(biāo)識(shí)結(jié)束。這樣做是為了后繼應(yīng)用時(shí),翻譯新句子沒有training label,只有英文輸入。把英文輸入放進(jìn)來后加一個(gè),得到第一個(gè)je輸出,把第一個(gè)詞放進(jìn)來得到第二個(gè)輸出bois。。最后翻譯結(jié)束。

最后實(shí)際應(yīng)用時(shí)如下,輸入開始翻譯。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 神經(jīng)元
    +關(guān)注

    關(guān)注

    1

    文章

    363

    瀏覽量

    18466
  • 機(jī)器翻譯
    +關(guān)注

    關(guān)注

    0

    文章

    139

    瀏覽量

    14906
  • rnn
    rnn
    +關(guān)注

    關(guān)注

    0

    文章

    89

    瀏覽量

    6895

原文標(biāo)題:【機(jī)器學(xué)習(xí)】RNN學(xué)習(xí)

文章出處:【微信號(hào):AI_shequ,微信公眾號(hào):人工智能愛好者社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    RNN算法的三個(gè)關(guān)鍵步驟

    DL之RNNRNN算法相關(guān)論文、相關(guān)思路、關(guān)鍵步驟、配圖集合+TF代碼定義
    發(fā)表于 12-28 14:20

    利用RNN進(jìn)行文章生成

    利用RNN進(jìn)行文章生成
    發(fā)表于 05-24 08:35

    遞歸神經(jīng)網(wǎng)絡(luò)(RNN

    遞歸神經(jīng)網(wǎng)絡(luò)(RNNRNN是最強(qiáng)大的模型之一,它使我們能夠開發(fā)如分類、序列數(shù)據(jù)標(biāo)注、生成文本序列(例如預(yù)測(cè)下一輸入詞的SwiftKey keyboard應(yīng)用程序),以及將一個(gè)序列轉(zhuǎn)換為另一個(gè)序列
    發(fā)表于 07-20 09:27

    CNN和RNN結(jié)合與對(duì)比,實(shí)例講解

    由 mengqiqi 于 星期三, 2018-09-05 09:58 發(fā)表 一、前述 CNN和RNN幾乎占據(jù)著深度學(xué)習(xí)的半壁江山,所以本文將著重講解CNN+RNN的各種組合方式,以及CNN和RNN
    發(fā)表于 09-06 22:32 ?811次閱讀

    深度分析RNN的模型結(jié)構(gòu),優(yōu)缺點(diǎn)以及RNN模型的幾種應(yīng)用

    神經(jīng)網(wǎng)絡(luò)是深度學(xué)習(xí)的載體,而神經(jīng)網(wǎng)絡(luò)模型中,最經(jīng)典非RNN模型所屬,盡管它不完美,但它具有學(xué)習(xí)歷史信息的能力。后面不管是encode-decode 框架,還是注意力模型,以及自注意力模型,以及更加
    的頭像 發(fā)表于 05-13 10:47 ?2.4w次閱讀
    深度分析<b class='flag-5'>RNN</b>的模型結(jié)構(gòu),優(yōu)缺點(diǎn)以及<b class='flag-5'>RNN</b>模型的幾種應(yīng)用

    什么是RNN(循環(huán)神經(jīng)網(wǎng)絡(luò))?RNN基本原理和優(yōu)缺點(diǎn)

    RNN(Recurrent Neural Network,循環(huán)神經(jīng)網(wǎng)絡(luò))是一種專門用于處理序列數(shù)據(jù)的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),它能夠在序列的演進(jìn)方向上進(jìn)行遞歸,并通過所有節(jié)點(diǎn)(循環(huán)單元)的鏈?zhǔn)竭B接來捕捉序列中
    的頭像 發(fā)表于 07-04 11:48 ?3780次閱讀

    rnn神經(jīng)網(wǎng)絡(luò)基本原理

    序列預(yù)測(cè)等領(lǐng)域有著廣泛的應(yīng)用。本文將詳細(xì)介紹RNN基本原理、結(jié)構(gòu)、優(yōu)化方法和應(yīng)用場(chǎng)景。 RNN基本原理 1.1 循環(huán)結(jié)構(gòu) RNN的核心思
    的頭像 發(fā)表于 07-04 15:02 ?745次閱讀

    rnn神經(jīng)網(wǎng)絡(luò)模型原理

    的應(yīng)用。本文將介紹RNN的原理、結(jié)構(gòu)、優(yōu)化方法以及實(shí)際應(yīng)用。 RNN基本原理 1.1 循環(huán)結(jié)構(gòu) RNN的核心特點(diǎn)是具有循環(huán)結(jié)構(gòu),即網(wǎng)絡(luò)中的神經(jīng)元不僅與前一層的神經(jīng)元相連,還與同一層次
    的頭像 發(fā)表于 07-04 15:40 ?620次閱讀

    rnn是什么神經(jīng)網(wǎng)絡(luò)

    RNN(Recurrent Neural Network,循環(huán)神經(jīng)網(wǎng)絡(luò))是一種具有循環(huán)連接的神經(jīng)網(wǎng)絡(luò),它能夠處理序列數(shù)據(jù),并且具有記憶能力。與傳統(tǒng)的前饋神經(jīng)網(wǎng)絡(luò)(Feedforward Neural
    的頭像 發(fā)表于 07-05 09:49 ?706次閱讀

    LSTM神經(jīng)網(wǎng)絡(luò)與傳統(tǒng)RNN的區(qū)別

    在深度學(xué)習(xí)領(lǐng)域,循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)因其能夠處理序列數(shù)據(jù)而受到廣泛關(guān)注。然而,傳統(tǒng)RNN在處理長(zhǎng)序列時(shí)存在梯度消失或梯度爆炸的問題。為了解決這一問題,LSTM(長(zhǎng)短期記憶)神經(jīng)網(wǎng)絡(luò)應(yīng)運(yùn)而生。 循環(huán)
    的頭像 發(fā)表于 11-13 09:58 ?370次閱讀

    如何使用RNN進(jìn)行時(shí)間序列預(yù)測(cè)

    一種強(qiáng)大的替代方案,能夠?qū)W習(xí)數(shù)據(jù)中的復(fù)雜模式,并進(jìn)行準(zhǔn)確的預(yù)測(cè)。 RNN基本原理 RNN是一種具有循環(huán)結(jié)構(gòu)的神經(jīng)網(wǎng)絡(luò),它能夠處理序列數(shù)據(jù)。在RNN中,每個(gè)輸入序列的元素都會(huì)通過一個(gè)或
    的頭像 發(fā)表于 11-15 09:45 ?316次閱讀

    RNN基本原理與實(shí)現(xiàn)

    RNN,即循環(huán)神經(jīng)網(wǎng)絡(luò)(Recurrent Neural Network),是一種特殊類型的人工神經(jīng)網(wǎng)絡(luò),專門設(shè)計(jì)用于處理序列數(shù)據(jù),如文本、語音、視頻等。以下是對(duì)RNN基本原理與實(shí)現(xiàn)的介紹: 一
    的頭像 發(fā)表于 11-15 09:49 ?486次閱讀

    RNN在圖片描述生成中的應(yīng)用

    輸入圖像的內(nèi)容。 RNN基本原理 RNN是一種用于處理序列數(shù)據(jù)的神經(jīng)網(wǎng)絡(luò),它通過循環(huán)結(jié)構(gòu)來處理序列中的每個(gè)元素,并保持前一個(gè)元素的信息。RNN的主要特點(diǎn)是它能夠處理任意長(zhǎng)度的序列,并
    的頭像 發(fā)表于 11-15 09:58 ?306次閱讀

    RNN與LSTM模型的比較分析

    RNN(循環(huán)神經(jīng)網(wǎng)絡(luò))與LSTM(長(zhǎng)短期記憶網(wǎng)絡(luò))模型在深度學(xué)習(xí)領(lǐng)域都具有處理序列數(shù)據(jù)的能力,但它們?cè)诮Y(jié)構(gòu)、功能和應(yīng)用上存在顯著的差異。以下是對(duì)RNN與LSTM模型的比較分析: 一、基本原理與結(jié)構(gòu)
    的頭像 發(fā)表于 11-15 10:05 ?544次閱讀

    RNN的應(yīng)用領(lǐng)域及未來發(fā)展趨勢(shì)

    循環(huán)神經(jīng)網(wǎng)絡(luò)(Recurrent Neural Network, RNN)是一種適合于處理序列數(shù)據(jù)的深度學(xué)習(xí)模型。由于其獨(dú)特的循環(huán)結(jié)構(gòu),RNN能夠處理時(shí)間序列數(shù)據(jù),捕捉時(shí)間序列中的動(dòng)態(tài)特征,因此在
    的頭像 發(fā)表于 11-15 10:10 ?544次閱讀