任務(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)行文本分類。
概念:
- 前饋神經(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ò)逊桦;
- 輸入層:
輸入層未做任何變換,可以不看做單獨(dú)的一層遥缕;
實(shí)際中網(wǎng)絡(luò)輸入層的每個(gè)神經(jīng)元代表了一個(gè)特征卫袒,輸入層個(gè)數(shù)代表了分類標(biāo)簽的個(gè)數(shù);
- 隱藏層
單個(gè)隱藏層的意義就是把輸入數(shù)據(jù)的特征宵呛,抽象到另一個(gè)維度空間单匣,來展現(xiàn)其更抽象化的特征;
多個(gè)隱藏層其實(shí)是對(duì)輸入特征多層次的抽象宝穗,最終的目的就是為了更好的線性劃分不同類型的數(shù)據(jù)户秤;
隱藏層層數(shù)以及隱藏層神經(jīng)元是由人工設(shè)定 ;補(bǔ)充:理論上隱藏層越多可以將特征劃分的更清楚逮矛,但是會(huì)帶來兩個(gè)問題:
- 層數(shù)越多參數(shù)會(huì)爆炸式增多
- 到了一定層數(shù)再往深了增加隱藏層鸡号,分類效果的增強(qiáng)會(huì)越來越不明顯
- 輸出層
在做二分類的時(shí)候,如果采用sigmoid分類器须鼎,輸出層的神經(jīng)元個(gè)數(shù)為1個(gè)鲸伴;如果采用softmax分類器輸出層神經(jīng)元個(gè)數(shù)為2個(gè)
- 隱藏單元
我們把網(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)出輸出不铆。
- 激活函數(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ù)圖如下所示:
求導(dǎo)推導(dǎo)為:
![]()
- sigmoid存在幾個(gè)缺點(diǎn)蔑穴,所以被使用的頻率較低
- 當(dāng)值非常大或者非常小是sigmoid的導(dǎo)數(shù)會(huì)趨近為0,則會(huì)導(dǎo)致梯度消失
- 函數(shù)的輸出不是以0位均值惧浴,不便于下一層的計(jì)算
- 當(dāng)目標(biāo)是解決一個(gè)二分類問題存和,可在輸出層使用sigmoid函數(shù)進(jìn)行二分類。
tanh函數(shù)
- 該函數(shù)數(shù)將取值為(?∞,+∞) 的數(shù)映射到(-1,1)之間衷旅,其公式以及函數(shù)圖如下所示:
tanh函數(shù)的均值為0捐腿,彌補(bǔ)了sigmoid函數(shù)均值為0.5的缺點(diǎn)
tanh函數(shù)的求導(dǎo)推導(dǎo)為:
![]()
- tanh與sigmoid存在相同的問題,當(dāng)值很大或者很小的時(shí)候會(huì)出現(xiàn)梯度消失的問題
ReLU函數(shù)
- ReLU函數(shù)又稱為修正線性單元, 是一種分段線性函數(shù)柿顶,其彌補(bǔ)了sigmoid函數(shù)以及tanh函數(shù)的梯度消失問題茄袖。ReLU函數(shù)的公式以及圖形如下:
ReLU函數(shù)求導(dǎo)為:
![]()
- 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)生梯度消失問題家乘。
- 感知機(jī)相關(guān)
感知機(jī)是二分類的線性分類模型蝗羊,輸入為實(shí)例的特征向量,輸出為實(shí)例的類別(取+1和-1)仁锯;
感知機(jī)目的在求一個(gè)可以將實(shí)例分開的超平面耀找,為了求它,我們用到基于誤分類的損失函數(shù)和梯度下降的優(yōu)化策略业崖。
感知機(jī)模型理解見:https://www.leiphone.com/news/201706/FEz9czQa8TMPGyqr.html
- 正則化
它的形式很簡(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)的作用:
- 增加訓(xùn)練的數(shù)據(jù)量乱投,提高模型的泛化能力
- 增加噪聲數(shù)據(jù)咽笼,提升模型的魯棒性
如何進(jìn)行數(shù)據(jù)增強(qiáng):
- 利用已有的數(shù)據(jù)比如翻轉(zhuǎn)、平移或旋轉(zhuǎn)戚炫,創(chuàng)造出更多的數(shù)據(jù)剑刑,來使得神經(jīng)網(wǎng)絡(luò)具有更好的泛化效果。
- 離線增強(qiáng):直接對(duì)數(shù)據(jù)集進(jìn)行處理双肤,數(shù)據(jù)的數(shù)目會(huì)變成增強(qiáng)因子 * 原數(shù)據(jù)集的數(shù)目 施掏,這種方法常常用于數(shù)據(jù)集很小的時(shí)候
- 在線增強(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)的模型,其主要步驟如下:
- 將原始的訓(xùn)練數(shù)據(jù)集劃分成訓(xùn)練集和驗(yàn)證集
- 只在訓(xùn)練集上進(jìn)行訓(xùn)練酥馍,并每個(gè)一個(gè)周期計(jì)算模型在驗(yàn)證集上的誤差辩昆,例如,每15次epoch(mini batch訓(xùn)練中的一個(gè)周期)
- 當(dāng)模型在驗(yàn)證集上的誤差比上一次訓(xùn)練結(jié)果差的時(shí)候停止訓(xùn)練
- 使用上一次迭代結(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
- 模型架構(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)
- 利用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