Task6 神經(jīng)網(wǎng)絡(luò)基礎(chǔ)

任務(wù)

  • 前饋神經(jīng)網(wǎng)絡(luò)降淮、網(wǎng)絡(luò)層數(shù)、輸入層搏讶、隱藏層佳鳖、輸出層、隱藏單元媒惕、激活函數(shù)的概念系吩。
  • 感知機(jī)相關(guān);定義簡(jiǎn)單的幾層網(wǎng)絡(luò)(激活函數(shù)sigmoid)妒蔚,遞歸使用鏈?zhǔn)椒▌t來實(shí)現(xiàn)反向傳播穿挨。
  • 激活函數(shù)的種類以及各自的提出背景、優(yōu)缺點(diǎn)肴盏。(和線性模型對(duì)比科盛,線性模型的局限性,去線性化)
  • 深度學(xué)習(xí)中的正則化(參數(shù)范數(shù)懲罰:L1正則化菜皂、L2正則化贞绵;數(shù)據(jù)集增強(qiáng);噪聲添加幌墓;early stop但壮;Dropout層)冀泻、正則化的介紹。
  • 深度模型中的優(yōu)化:參數(shù)初始化策略蜡饵;自適應(yīng)學(xué)習(xí)率算法(梯度下降弹渔、AdaGrad、RMSProp溯祸、Adam肢专;優(yōu)化算法的選擇);batch norm層(提出背景焦辅、解決什么問題博杖、層在訓(xùn)練和測(cè)試階段的計(jì)算公式);layer norm層筷登。
  • FastText的原理剃根。
  • 利用FastText模型進(jìn)行文本分類。

概念:

  1. 前饋神經(jīng)網(wǎng)絡(luò)

這是實(shí)際應(yīng)用中最常見的神經(jīng)網(wǎng)絡(luò)類型前方。
第一層是輸入狈醉,最后一層是輸出,如果有多個(gè)隱藏層則稱之為“深度”神經(jīng)網(wǎng)絡(luò)惠险。他們計(jì)算出一系列改變樣本相似性的變換苗傅。各層神經(jīng)元的活動(dòng)是前一層活動(dòng)的非線性函數(shù)。

2.網(wǎng)絡(luò)層數(shù)

神經(jīng)網(wǎng)絡(luò)主要由:輸入層班巩,隱藏層渣慕,輸出層構(gòu)成。
當(dāng)隱藏層只有一層時(shí)抱慌,該網(wǎng)絡(luò)為兩層神經(jīng)網(wǎng)絡(luò)逊桦;

  1. 輸入層:

輸入層未做任何變換,可以不看做單獨(dú)的一層遥缕;
實(shí)際中網(wǎng)絡(luò)輸入層的每個(gè)神經(jīng)元代表了一個(gè)特征卫袒,輸入層個(gè)數(shù)代表了分類標(biāo)簽的個(gè)數(shù);

  1. 隱藏層

單個(gè)隱藏層的意義就是把輸入數(shù)據(jù)的特征宵呛,抽象到另一個(gè)維度空間单匣,來展現(xiàn)其更抽象化的特征;
多個(gè)隱藏層其實(shí)是對(duì)輸入特征多層次的抽象宝穗,最終的目的就是為了更好的線性劃分不同類型的數(shù)據(jù)户秤;
隱藏層層數(shù)以及隱藏層神經(jīng)元是由人工設(shè)定 ;

補(bǔ)充:理論上隱藏層越多可以將特征劃分的更清楚逮矛,但是會(huì)帶來兩個(gè)問題:

  1. 層數(shù)越多參數(shù)會(huì)爆炸式增多
  2. 到了一定層數(shù)再往深了增加隱藏層鸡号,分類效果的增強(qiáng)會(huì)越來越不明顯
  1. 輸出層

在做二分類的時(shí)候,如果采用sigmoid分類器须鼎,輸出層的神經(jīng)元個(gè)數(shù)為1個(gè)鲸伴;如果采用softmax分類器輸出層神經(jīng)元個(gè)數(shù)為2個(gè)

  1. 隱藏單元

我們把網(wǎng)絡(luò)中的每一個(gè)結(jié)點(diǎn)稱之為一個(gè)神經(jīng)元(單元)府蔗,隱藏單元即為隱藏層中的神經(jīng)元(單元);
其中,神經(jīng)元:人工神經(jīng)元(Artificial Neuron)汞窗,簡(jiǎn)稱神經(jīng)元(Neuron)姓赤,是構(gòu)成神經(jīng)網(wǎng)絡(luò)的基本單元,其主要是模擬生物神經(jīng)元的結(jié)構(gòu)和特性仲吏,接受一組輸入信號(hào)并產(chǎn)出輸出不铆。

  1. 激活函數(shù)

激活函數(shù)是用來加入非線性因素的,解決線性模型所不能解決的問題裹唆;
在神經(jīng)網(wǎng)絡(luò)中誓斥,我們可以經(jīng)常看到對(duì)于某一個(gè)隱藏層的節(jié)點(diǎn)许帐,該節(jié)點(diǎn)的激活之計(jì)算一般分為兩步:
(1) 輸入該節(jié)點(diǎn)的值后先進(jìn)行一個(gè)線性變換劳坑,計(jì)算出值
(2)再進(jìn)行一個(gè)非線性變換,也就是經(jīng)過一個(gè)非線性激活函數(shù)

常用的激活函數(shù)包括:sigmoid函數(shù)成畦、tanh函數(shù)泡垃、ReLU函數(shù)。

sigmoid函數(shù):

  • 該函數(shù)數(shù)將取值為(?∞,+∞) 的數(shù)映射到(0,1)之間羡鸥,其公式以及函數(shù)圖如下所示:
    g(z)=\frac{1}{1+e^{-z}}

    求導(dǎo)推導(dǎo)為:
    g'(z) = (\frac{1}{1+e^{-z}})'=\frac{e^{-z}}{(1+e^{-z})^2}=g(z)(1-g(z))
  • sigmoid存在幾個(gè)缺點(diǎn)蔑穴,所以被使用的頻率較低
    1. 當(dāng)值非常大或者非常小是sigmoid的導(dǎo)數(shù)會(huì)趨近為0,則會(huì)導(dǎo)致梯度消失
    2. 函數(shù)的輸出不是以0位均值惧浴,不便于下一層的計(jì)算
    3. 當(dāng)目標(biāo)是解決一個(gè)二分類問題存和,可在輸出層使用sigmoid函數(shù)進(jìn)行二分類。

tanh函數(shù)

  • 該函數(shù)數(shù)將取值為(?∞,+∞) 的數(shù)映射到(-1,1)之間衷旅,其公式以及函數(shù)圖如下所示:
    g(z)=\frac{e^{z}-e^{-z}}{e^{z}+e^{-z}}

    tanh函數(shù)的均值為0捐腿,彌補(bǔ)了sigmoid函數(shù)均值為0.5的缺點(diǎn)
    tanh函數(shù)的求導(dǎo)推導(dǎo)為:
    g(z)=(\frac{e^{z}-e^{-z}}{e^{z}+e^{-z}})^{'}=\frac{4}{(e^{z}+e^{-z})^2}=1-g(z)^2
    • tanh與sigmoid存在相同的問題,當(dāng)值很大或者很小的時(shí)候會(huì)出現(xiàn)梯度消失的問題

ReLU函數(shù)

  • ReLU函數(shù)又稱為修正線性單元, 是一種分段線性函數(shù)柿顶,其彌補(bǔ)了sigmoid函數(shù)以及tanh函數(shù)的梯度消失問題茄袖。ReLU函數(shù)的公式以及圖形如下:
    g(z)=\begin{cases}z, if z > 0\\ 0, if z < 0 \end{cases}

    ReLU函數(shù)求導(dǎo)為:
    g'(z)=\begin{cases}1, if z > 0\\ 0, if z < 0 \end{cases}
  • ReLU的優(yōu)點(diǎn):1. 當(dāng)輸入大于0時(shí),不存在梯度消失的問題2. 由于ReLU函數(shù)只有線性關(guān)系嘁锯,所以計(jì)算速度要快很多
  • Relu的缺點(diǎn):當(dāng)輸入小于0時(shí)宪祥,梯度為0,會(huì)產(chǎn)生梯度消失問題家乘。
  1. 感知機(jī)相關(guān)

感知機(jī)是二分類的線性分類模型蝗羊,輸入為實(shí)例的特征向量,輸出為實(shí)例的類別(取+1和-1)仁锯;
感知機(jī)目的在求一個(gè)可以將實(shí)例分開的超平面耀找,為了求它,我們用到基于誤分類的損失函數(shù)和梯度下降的優(yōu)化策略业崖。

感知機(jī)模型理解見:https://www.leiphone.com/news/201706/FEz9czQa8TMPGyqr.html

  1. 正則化

它的形式很簡(jiǎn)單野芒,是在目標(biāo)函數(shù)后額外附加一項(xiàng)蓄愁,使其影響目標(biāo)函數(shù)最優(yōu)點(diǎn)的選取。這種方法叫做正則化方法狞悲。
L1正則化涝登、L2正則化原理參考:https://blog.csdn.net/u012950413/article/details/80464318#L1_86

  • 數(shù)據(jù)集增強(qiáng)

數(shù)據(jù)集增強(qiáng)的原因:一般而言,比較成功的神經(jīng)網(wǎng)絡(luò)需要大量的參數(shù)效诅,許許多多的神經(jīng)網(wǎng)路的參數(shù)都是數(shù)以百萬(wàn)計(jì)胀滚,而使得這些參數(shù)可以正確工作則需要大量的數(shù)據(jù)進(jìn)行訓(xùn)練,而實(shí)際情況中數(shù)據(jù)并沒有我們想象中的那么多

  • 數(shù)據(jù)集增強(qiáng)的作用:
    1. 增加訓(xùn)練的數(shù)據(jù)量乱投,提高模型的泛化能力
    2. 增加噪聲數(shù)據(jù)咽笼,提升模型的魯棒性

如何進(jìn)行數(shù)據(jù)增強(qiáng):

  • 利用已有的數(shù)據(jù)比如翻轉(zhuǎn)、平移或旋轉(zhuǎn)戚炫,創(chuàng)造出更多的數(shù)據(jù)剑刑,來使得神經(jīng)網(wǎng)絡(luò)具有更好的泛化效果。
  1. 離線增強(qiáng):直接對(duì)數(shù)據(jù)集進(jìn)行處理双肤,數(shù)據(jù)的數(shù)目會(huì)變成增強(qiáng)因子 * 原數(shù)據(jù)集的數(shù)目 施掏,這種方法常常用于數(shù)據(jù)集很小的時(shí)候
  2. 在線增強(qiáng) : 這種增強(qiáng)的方法用于,獲得 batch 數(shù)據(jù)之后茅糜,然后對(duì)這個(gè) batch 的數(shù)據(jù)進(jìn)行增強(qiáng)七芭,如旋轉(zhuǎn)、平移蔑赘、翻折等相應(yīng)的變化狸驳,由于有些數(shù)據(jù)集不能接受線性級(jí)別的增長(zhǎng),這種方法長(zhǎng)用于大的數(shù)據(jù)集缩赛。
  • Early stoping

Early stopping可以實(shí)現(xiàn)在指定位置停止訓(xùn)練耙箍,獲得一個(gè)泛化能力較強(qiáng)的模型,其主要步驟如下:

  1. 將原始的訓(xùn)練數(shù)據(jù)集劃分成訓(xùn)練集和驗(yàn)證集
  2. 只在訓(xùn)練集上進(jìn)行訓(xùn)練酥馍,并每個(gè)一個(gè)周期計(jì)算模型在驗(yàn)證集上的誤差辩昆,例如,每15次epoch(mini batch訓(xùn)練中的一個(gè)周期)
  3. 當(dāng)模型在驗(yàn)證集上的誤差比上一次訓(xùn)練結(jié)果差的時(shí)候停止訓(xùn)練
  4. 使用上一次迭代結(jié)果中的參數(shù)作為模型的最終參數(shù)

補(bǔ)充:在現(xiàn)實(shí)中旨袒,模型在驗(yàn)證集上的誤差并不平滑汁针,也就是模型在驗(yàn)證集上的表現(xiàn)可能短暫的變差之后有可能繼續(xù)變好,所以早停法主要是訓(xùn)練時(shí)間和泛化錯(cuò)誤之間的權(quán)衡峦失。

  • Dropout層

我們?cè)谇跋騻鞑サ臅r(shí)候扇丛,讓某個(gè)神經(jīng)元的激活值以一定的概率p停止工作术吗,這樣可以使模型泛化性更強(qiáng)尉辑,因?yàn)樗粫?huì)太依賴某些局部的特征
工作流程及使用參見:https://blog.csdn.net/program_developer/article/details/80737724

FastText

  1. 模型架構(gòu)

fasttext算法是一種有監(jiān)督的結(jié)構(gòu),它通過上下文預(yù)測(cè)標(biāo)簽即文本的類別
fasttext模型的輸入是一個(gè)詞/一句話/一段文本的序列较屿,輸出的是這個(gè)序列屬于不用類別的概率隧魄。
在序列中的詞和詞組構(gòu)成特征向量卓练,特征向量通過線性變換映射到中間層,再由中間層映射到標(biāo)簽购啄。
fasttext在預(yù)測(cè)標(biāo)簽時(shí)使用了非線性激活函數(shù)襟企,但在中間層不使用非線性激活函數(shù)。


fasttext代碼整體結(jié)構(gòu)
  1. 利用FastText模型進(jìn)行文本分類

注意:win無法直接用pip install fasttext安裝fasttext狮含,我首先在python的第三方安裝包網(wǎng)站https://www.lfd.uci.edu/~gohlke/pythonlibs/#fasttext*
下載fasttext?0.8.22?cp36?cp36m?win_amd64.whl后再本地安裝

fasttext本地安裝方法

本地調(diào)用fasttext:

import fastText.FastText as ff

補(bǔ)充:實(shí)驗(yàn)進(jìn)行文本分類的文件已事先分詞顽悼、去停用詞后的結(jié)果

  • 首先讀文件
def read_file(path):
    with open(path, 'r', encoding="UTF-8") as f:
        data = []
        labels = []
        for line in f:
            data.append(line.split('\t')[0])
            labels.append(line.split('\t')[1])
    return data, labels

data, labels = read_file('E:/task6/merge.txt')
  • 對(duì)數(shù)據(jù)進(jìn)行預(yù)處理

fasttext訓(xùn)練數(shù)據(jù)是直接對(duì)文件進(jìn)行讀取,所以在訓(xùn)練前應(yīng)當(dāng)對(duì)數(shù)據(jù)進(jìn)行處理几迄,
fasttext讀取的文件有固定格式:

第一列 第二列 第三列
label前綴 標(biāo)簽值 編碼后文本

本次實(shí)驗(yàn)文本處理后格式為:

__label__0 379 3 2 322 75 19
__label__0 1284 134 811 546 2508 57 20 48 233 20 43 17 2 20 47 173 1284 134
__label__1 116 29 812 139 79 4
__label__1 21 281 79 68
__label__0 49 32

實(shí)現(xiàn)代碼如下所示:

def get_tokenizer_data(data):
    '''
        fasttext傳入文本必須對(duì)其進(jìn)行預(yù)處理和編碼
    '''
    tokenizer = Tokenizer(num_words=None)
    # 得到文本的字典
    tokenizer.fit_on_texts(data)
    # 將每個(gè)string的每個(gè)詞轉(zhuǎn)成數(shù)字
    data = tokenizer.texts_to_sequences(data)
    return data

# 劃分?jǐn)?shù)據(jù)集
X_train, X_test, y_train, y_test = train_test_split(data, 
                                                    labels,
                                                    test_size = 0.2,
                                                    random_state=33)
# 在標(biāo)簽值前增加前綴
label_train = [('__label__' + i).replace('\n', '') for i in y_train]
# 向量化文本
tokenizer_train = get_tokenizer_data(X_train)
# 將label列與文本列合并為一行
train = [i + ' ' + str(j).replace('[', '').replace(']', '').replace(',', '') for i, j in zip(label_train, tokenizer_train)]
  • 最后使用fasttext訓(xùn)練文本并預(yù)測(cè)
def fast_text_model(X_test):
    '''
        使用fasttext進(jìn)行文本分類
    '''
    # 分類訓(xùn)練
    classifier = ff.train_supervised('E:/task6/train.txt', label='__label__')
    # 模型預(yù)測(cè)蔚龙,返回預(yù)測(cè)標(biāo)簽和概率
    label, prob = classifier.predict(X_test)
    print(label)
    print(prob)
    # 根據(jù)給定數(shù)據(jù)集對(duì)模型進(jìn)行評(píng)價(jià),返回樣本個(gè)數(shù)映胁、準(zhǔn)確率木羹、召回率
    result = classifier.test('E:/task6/test.txt')
    print(result)
    return label, prob, result

補(bǔ)充:用gensim.model.fasttext獲取詞向量

from gensim.models.fasttext import FastText
FASTEXT_SIZE = 100


def get_fasttext_voc(data, word_index):
    '''
        利用fasttext獲取詞向量
    '''
    fasttext_model = FastText([data], 
                              size=FASTEXT_SIZE,         # 需要學(xué)習(xí)的嵌入大小(默認(rèn)為100)
                              window=3,         # 上下文窗口大小(默認(rèn)5)
                              min_count=1,      # 忽略出現(xiàn)次數(shù)低于此值的單詞(默認(rèn)值5)
                              iter=10,          # epoch(默認(rèn)5)
                              min_n = 3,        # char ngram的最小長(zhǎng)度(默認(rèn)值3)
                              max_n = 6,        # char ngram的最大長(zhǎng)度(默認(rèn)值6)
                              word_ngrams = 0)  # 如果為1,使用子單詞(n-grams)信息豐富單詞向量解孙。如果是0坑填,這就相當(dāng)于Word2Vec
    # 獲取詞向量詞典
    word_voc_dict = fasttext_model.wv.vocab
    word_voc_list = fasttext_model.wv.index2word
    # 獲取詞向量列表
    wordEmbedding = np.zeros((len(word_index) + 1, FASTEXT_SIZE))
    for word, i in word_index.items():
        if word in fasttext_model:
            wordEmbedding[i] = fasttext_model[word]
    
    return word_voc_dict, word_voc_list, wordEmbedding

完整代碼+數(shù)據(jù)集見github

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市弛姜,隨后出現(xiàn)的幾起案子脐瑰,更是在濱河造成了極大的恐慌,老刑警劉巖廷臼,帶你破解...
    沈念sama閱讀 222,865評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蚪黑,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡中剩,警方通過查閱死者的電腦和手機(jī)忌穿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來结啼,“玉大人掠剑,你說我怎么就攤上這事〗祭ⅲ” “怎么了朴译?”我有些...
    開封第一講書人閱讀 169,631評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)属铁。 經(jīng)常有香客問我眠寿,道長(zhǎng),這世上最難降的妖魔是什么焦蘑? 我笑而不...
    開封第一講書人閱讀 60,199評(píng)論 1 300
  • 正文 為了忘掉前任盯拱,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘狡逢。我一直安慰自己宁舰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,196評(píng)論 6 398
  • 文/花漫 我一把揭開白布奢浑。 她就那樣靜靜地躺著蛮艰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪雀彼。 梳的紋絲不亂的頭發(fā)上壤蚜,一...
    開封第一講書人閱讀 52,793評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音徊哑,去河邊找鬼仍律。 笑死,一個(gè)胖子當(dāng)著我的面吹牛实柠,可吹牛的內(nèi)容都是我干的水泉。 我是一名探鬼主播,決...
    沈念sama閱讀 41,221評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼窒盐,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼草则!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蟹漓,我...
    開封第一講書人閱讀 40,174評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤炕横,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后葡粒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體份殿,經(jīng)...
    沈念sama閱讀 46,699評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,770評(píng)論 3 343
  • 正文 我和宋清朗相戀三年嗽交,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了卿嘲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,918評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡夫壁,死狀恐怖拾枣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情盒让,我是刑警寧澤梅肤,帶...
    沈念sama閱讀 36,573評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站邑茄,受9級(jí)特大地震影響姨蝴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜肺缕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,255評(píng)論 3 336
  • 文/蒙蒙 一左医、第九天 我趴在偏房一處隱蔽的房頂上張望授帕。 院中可真熱鬧,春花似錦炒辉、人聲如沸豪墅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至斩萌,卻和暖如春缝裤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背颊郎。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工憋飞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人姆吭。 一個(gè)月前我還...
    沈念sama閱讀 49,364評(píng)論 3 379
  • 正文 我出身青樓榛做,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親内狸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子检眯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,926評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容