1. 程式人生 > >糾錯: 深度學習模型優化時快速收斂

糾錯: 深度學習模型優化時快速收斂

最近在做問答系統,用CNN深度學習模型分別對問題、正答案和負答案提取特徵,得到各自的特徵向量。正答案與問題之間的距離比負答案與問題之間的距離要近,距離用夾角的cos值來表示,目標函式是由此確定的。模型出自《Applying Deep Learning To Answer Selection: A Study And An Open Task》,如圖1所示。
這裡寫圖片描述
圖 1
用tensorflow架構實現該模型,然而做模型優化時,5步以內模型的loss就為0了,精度達到了1,如圖2所示。‘
這裡寫圖片描述
圖 2
迷糊了一個星期,才找到問題點。
原來是因為在用CNN做特徵提取時,我對三個輸入(問題、正答案、負答案)分別做了模型weight初始化,相當於建立了三個CNN分別對問題、正答案、負答案做特徵抽取。程式碼如下,呼叫了conv函式三遍,初始化了W三次,建立了三個CNN模型。

# define a convolution function 
    def conv(input_data):
        pooled_outputs = []
        for i, filter_size in enumerate(filter_sizes):
                with tf.name_scope("conv-maxpool-%s" % filter_size):
                    # Convolution Layer         
            filter_shape = [filter_size, embedding_size, 1
, num_filters] W = tf.Variable(tf.truncated_normal(filter_shape, stddev=0.1), name="W") b = tf.Variable(tf.constant(0.1, shape=[num_filters]), name="b") conv = tf.nn.conv2d(input_data, W, strides=[1, 1, 1, 1], padding="VALID", name="conv"
) h = tf.nn.relu(tf.nn.bias_add(conv, b), name="relu") pooled = tf.nn.max_pool( h, ksize=[1, sequence_length - filter_size + 1, 1, 1], strides=[1, 1, 1, 1], padding='VALID', name="pool") # shape of pooled is [batch_size,1,1,num_filters] pooled_outputs.append(pooled) return pooled_outputs pooled_outputs1=conv(self.embedded_chars1_expanded) # conv-pool outputs pooled_outputs2=conv(self.embedded_chars2_expanded) pooled_outputs3=conv(self.embedded_chars3_expanded)

為什麼用三個CNN模型做QA系統的答案選擇不行呢?此時的模型相當於如下圖3的結構。
這裡寫圖片描述
圖 3
三個CNN模型分別做特徵提取,導致模型對負答案失去約束力,也就是說負答案的卷積神經網路模型使它始終離問題很遠(夾角的cos值小),即使此負答案CNN模型的輸入是正答案,距離仍然會遠(夾角仍然會小)。打個形象的比喻,就像是讓負答案乘以0,無論輸入怎麼變,輸出都是零,這樣的約束沒有了意義。
對程式碼進行如下修改。

pooled_outputs1 = []
        pooled_outputs2 = []
        pooled_outputs3 = []
        for i, filter_size in enumerate(filter_sizes):
            with tf.name_scope("conv-maxpool-%s" % filter_size):
                filter_shape = [filter_size, embedding_size, 1, num_filters]
                W = tf.Variable(tf.truncated_normal(filter_shape, stddev=0.1), name="W")
                b = tf.Variable(tf.constant(0.1, shape=[num_filters]), name="b")
                conv = tf.nn.conv2d(self.embedded_chars1_expanded, W, strides=[1, 1, 1, 1],
                                    padding="VALID", name="conv")
                h = tf.nn.relu(tf.nn.bias_add(conv, b), name="relu")
                pooled = tf.nn.max_pool(
                                h,
                                ksize=[1, sequence_length - filter_size + 1, 1, 1],
                                strides=[1, 1, 1, 1],
                                padding='VALID',
                                name="pool")  # shape of pooled is [batch_size,1,1,num_filters]
                pooled_outputs1.append(pooled)
                conv = tf.nn.conv2d(self.embedded_chars2_expanded, W, strides=[1, 1, 1, 1],
                                    padding="VALID", name="conv")
                h = tf.nn.relu(tf.nn.bias_add(conv, b), name="relu")
                        pooled = tf.nn.max_pool(
                                h,
                                ksize=[1, sequence_length - filter_size + 1, 1, 1],
                                strides=[1, 1, 1, 1],
                                padding='VALID',
                                name="pool")  # shape of pooled is [batch_size,1,1,num_filters]
                        pooled_outputs2.append(pooled)
                        conv = tf.nn.conv2d(self.embedded_chars3_expanded, W, strides=[1, 1, 1, 1],
                                    padding="VALID", name="conv")
        # print('\n--- shape of cov is {}'.format(conv.get_shape()))
        # Apply nonlinearity
                        h = tf.nn.relu(tf.nn.bias_add(conv, b), name="relu")
        # Max-pooling over the outputs
                        pooled = tf.nn.max_pool(
                                h,
                                ksize=[1, sequence_length - filter_size + 1, 1, 1],
                                strides=[1, 1, 1, 1],
                                padding='VALID',
                                name="pool")  # shape of pooled is [batch_size,1,1,num_filters]
                        pooled_outputs3.append(pooled)

改過的程式可以正常運行了,準確率和論文描述的相當。

相關推薦

糾錯 深度學習模型優化快速收斂

最近在做問答系統,用CNN深度學習模型分別對問題、正答案和負答案提取特徵,得到各自的特徵向量。正答案與問題之間的距離比負答案與問題之間的距離要近,距離用夾角的cos值來表示,目標函式是由此確定的。模型出自《Applying Deep Learning To An

關於訓練深度學習模型deepNN,訓練精度維持固定值,模型收斂的解決辦法(tensorflow實現)

一、背景 最近一直在做人臉表情的識別,用到的程式是之間的一篇文章中的程式:深度學習(一)——deepNN模型實現攝像頭實時識別人臉表情(C++和python3.6混合程式設計)。這裡我只進行了簡單的程式修改。 由於該程式是利用fer2013資料集做的,效果不是很好,人臉表情的識別精度僅有70

20180813視頻筆記 深度學習基礎上篇(1)之必備基礎知識點 深度學習基礎上篇(2)神經網絡模型視頻筆記深度學習基礎上篇(3)神經網絡案例實戰 和 深度學習基礎下篇

計算 概念 人臉識別 大量 png 技巧 表現 lex github 深度學習基礎上篇(3)神經網絡案例實戰 https://www.bilibili.com/video/av27935126/?p=1 第一課:開發環境的配置 Anaconda的安裝 庫的安裝 Windo

深度學習除錯網路常用的優化演算法總結

自己的小專案在實際除錯中出現過的優化模型的演算法,這裡做一個總結。 1、 學習率調整(避免欠擬合) 2、 正則化(避免過擬合) 3、 Dropout(避免過擬合) 4、 提前終止(避免過擬合) 學習率調整: 在訓練網路的時候,已不變的學習率學習往往不能找到最優解,從而使loss值

Facebook開源Caffe2深度學習框架 開發者可快速訓練和迭代AI模型

在Facebook與NVIDIA的合作中,工程師基於NVIDIA的GPU平臺深度優化了Caffe2。Caffe2深度學習框架中採用最新的NVIDIA深度學習SDK庫(cuDNN,cuBLAS和NCCL)來提供高效能運算,多GPU加速的訓練以及推理。由於Caffe2在NVIDIA GPU的平臺上的優異表現,使用

阿里雲使用筆記(一)從零開始配置阿里雲GPU伺服器訓練深度學習模型

題 神經網路訓練需要強大的GPU支援,自己搭建成本太高,並且有時候出差等原因,無法將龐大的機箱搬走。因此,就產生了將深度學習網路訓練的任務搬到雲端的想法。由於初次使用,遇到不少大坑,花了兩天時間才完整的實現。 要實現的功能: - 安裝anaconda管理庫

實戰 | 深度學習輕鬆學如何用視覺化介面來部署深度學習模型

翻譯 | AI科技大本營參與 | 王赫上個月,我有幸結識了 DeepCognition.ai 的

深度學習模型優化演算法及tensorflow實現

模型的優化對於傳統機器學習和深度學習都是很重要的,尤其是深度學習,在訓練過中很可能需要解決一些更加困難的挑戰。目前來說,流行且使用較廣泛的優化演算法有隨機梯度下降,具動量的隨機梯度下降,RMSProp演算法,具動量的RMSProp,AdaDelta和Adam等,

深度學習模型壓縮與優化加速(Model Compression and Acceleration Overview)

1. 簡介 深度學習(Deep Learning)因其計算複雜度或引數冗餘,在一些場景和裝置上限制了相應的模型部署,需要藉助模型壓縮、優化加速、異構計算等方法突破瓶頸。 模型壓縮演算法能夠有效降低引數冗餘,從而減少儲存佔用、通訊頻寬和計算複雜度,有助於深度學習的應用部署,

Deep Learning-TensorFlow (10) CNN卷積神經網路_ TFLearn 快速搭建深度學習模型

環境:Win8.1 TensorFlow1.0.1 軟體:Anaconda3 (整合Python3及開發環境) TensorFlow安裝:pip install tensorflow (CPU版) pip install tensorflow-gpu (GPU版) TFLe

Keras TensorFlow教程如何從零開發一個複雜深度學習模型

Keras 是提供一些高可用的 Python API ,能幫助你快速的構建和訓練自己的深度學習模型,它的後端是 TensorFlow 或者 Theano 。本文假設你已經熟悉了 TensorFlow 和卷積神經網路,如果,你還沒有熟悉,那麼可以先看看這個10分鐘入門 TensorFlow 教程和卷積

使用Keras由零開始快速構造自己的深度學習模型

《SDCC 2017人工智慧技術實戰》 什麼是keras Keras是一個高層神經網路API,Keras由純Python編寫而成並基Tensorflow、Theano以及CNTK後端。Keras 為支援快速實驗而生,能夠把你的idea迅速轉換為結果,如果

實戰 | 深度學習輕鬆學如何用視覺化介面來部署深度學習模型 轉載 2017年12月27日 00:00:00 109 翻譯 | AI科技大本營 參與 | 王赫 上個月,我有幸結識了 DeepCogn

翻譯 | AI科技大本營 參與 | 王赫 上個月,我有幸結識了 DeepCognition.ai 的創始人。 Deep Cognition (深度認知) 建立的深度學習工作室,為很多準備部署深度學習框架和採用人工智慧技術的機構打破了諸多難以逾越的障礙。 究竟什麼是深度學習?

ImageNet 歷屆冠軍最新評析哪個深度學習模型最適合你?

深度神經網路自出現以來,已經成為計算機視覺領域一項舉足輕重的技術。其中,ImageNet 影象分類競賽極大地推動著這項新技術的發展。精確計算水平取得了穩步的增長,但頗具吸引力的模型應用尚未得到合理的利用。本文將綜合分析實際應用中的幾項重要指標:準確度、記憶體佔用、引數、操作時

15天倒計時深度學習高端講座免費聽,最後200位贈教材名額!

技術講座 深度學習 tensor 深度學習是對使用多層神經網絡過程進行機器學習的統稱。目前已經被應用到圖像識別,語音識別,自然語言處理,機器翻譯等場景並取得了很好的行業應用效果。由谷歌研發的新一代深度學習工具Tensor Flow,於2015年底正式向公眾開源。Tensor Flow技術是當前最值

人工智能AI專家分享深度學習初學解惑

body 並且 對話 我想 問題 哲學 方向 智能 科學家 ---恢復內容開始--- 導語:高揚,現某創業公司數據科學家、人工智能專家。前歡聚時代資深大數據專家,有豐富的機器學習、深度學習實戰經驗。 在高揚老師此前的分享中,有不少同學問到高揚老師各種關於入門深度學習這個前沿

使用GOOGLE COLAB訓練深度學習模型

edi play bottom art one con style right tag 來自為知筆記(Wiz)使用GOOGLE COLAB訓練深度學習模型

深度學習模型相關知識(2)

fas bubuko 深度學習 image ive bsp 提取 AS 簡寫 參考:https://blog.csdn.net/lanran2/article/details/60143861 ROI pooling: ROI是Regin of Interest的簡寫,指的

吳恩達深度學習作業2相關

.com image 就是 訓練數據 自己 包括 數據量 很好 我們 深度學習小知識點:(欠擬合與過擬合) 1.出現欠擬合應該怎樣解決:(欠擬合就是模型沒能很好的捕捉到數據的特征,不能很好地擬合數據) 欠擬合的情況如圖所示: a.增加特征項,出現欠擬合的原因一般是特征項不

深度學習優化算法

次數 style -s 響應 color 優化 通過 pan 最優解 最優化理論裏面 0階優化算法 1階優化算法 2階優化算法 具體定義和缺陷如下:針對深度學習以一階的優化算法為主為主線 0階優化算法:該算法僅僅需要因變量的數值,而不需要導數信息。因變量通過最小二乘法的擬合