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

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

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

如何創(chuàng)建張量并實現(xiàn)張量類型轉(zhuǎn)化

wFVr_Hardware_1 ? 來源:硬件十萬個為什么 ? 作者:硬件十萬個為什么 ? 2022-12-06 10:47 ? 次閱讀

我們在 深度學(xué)習(xí)框架(3)-TensorFlow中張量創(chuàng)建和轉(zhuǎn)化,妙用“稀疏性”提升效率 中討論了如何創(chuàng)建張量并實現(xiàn)張量類型轉(zhuǎn)化。今天我們一起在TensorFlow中執(zhí)行張量的計算,并重點討論一下不同的激活函數(shù)。

1、了解不同的激活函數(shù),根據(jù)應(yīng)用選擇不同的激活函數(shù)

我們在 機器學(xué)習(xí)中的函數(shù)(1)-激活函數(shù)和感知機中討論過 激活函數(shù)是在神經(jīng)網(wǎng)絡(luò)層間輸入與輸出之間的一種函數(shù)變換,目的是為了加入非線性因素,增強模型的表達能力。激活函數(shù)的作用類似于人類大腦中基于神經(jīng)元的模型(參考下圖),激活函數(shù)最終決定了要發(fā)射給下一個神經(jīng)元的內(nèi)容。

(1)激活函數(shù)有什么價值?

激活函數(shù)對于人工神經(jīng)網(wǎng)絡(luò)模型去學(xué)習(xí)、理解非常復(fù)雜和非線性的函數(shù)來說具有十分重要的作用。首先對于y=ax+b這樣的函數(shù),當(dāng)x的輸入很大時,y的輸出也是無限大/小的,經(jīng)過多層網(wǎng)絡(luò)疊加后,值更加膨脹了,這顯然不符合我們的預(yù)期,很多情況下我們希望的輸出是一個概率,需要激活函數(shù)能幫助網(wǎng)絡(luò)進行收斂。其次,線性變換模式相對簡單(只是加權(quán)偏移),限制了對復(fù)雜任務(wù)的處理能力,沒有激活函數(shù)的神經(jīng)網(wǎng)絡(luò)就是一個線性回歸模型;激活函數(shù)做的非線性變換可以使得神經(jīng)網(wǎng)絡(luò)處理非常復(fù)雜的任務(wù),如我們希望我們的神經(jīng)網(wǎng)絡(luò)可以對語言翻譯和圖像分類做操作,這就需要非線性轉(zhuǎn)換。最后,激活函數(shù)也使得反向傳播算法變得可能,因為這時候梯度和誤差會被同時用來更新權(quán)重和偏移,沒有可微分的線性函數(shù),就不可能實現(xiàn)。

(2)有哪些常用的激活函數(shù)?

常用的激活函數(shù)有,Sigmoid激活函數(shù),Tan/ 雙曲正切激活函數(shù),ReLU激活函數(shù)(還有改進后的LeakyReLU和PReLU),Softmax激活函數(shù)等。

(3)激活函數(shù)使用時有哪些問題?如何改進激活函數(shù)?

Sigmoid梯度消失問題可以通過Relu解決

梯度、梯度下降、鏈式法則等概念可參考機器學(xué)習(xí)中的函數(shù)(3)-“梯度下降”走捷徑,“BP算法”提效率 中的描述。我們以Sigmoid為例,看一下“梯度消失”是如何發(fā)生的?Sigmoid的函數(shù)公式和圖像如下圖,從圖中可見函數(shù)兩個邊緣的梯度約為0,Sigmoid導(dǎo)數(shù)取值取值范圍為(0,0.25)。

當(dāng)我們求激活函數(shù)輸出相對于權(quán)重參數(shù)W的偏導(dǎo)時,Sigmoid函數(shù)的梯度是表達式中的一個乘法因子。實際的神經(jīng)網(wǎng)絡(luò)層數(shù)少則數(shù)十多則數(shù)百層,由于神經(jīng)網(wǎng)絡(luò)反向傳播時的“鏈式反應(yīng)”,這么多范圍在(0,0.25)的數(shù)相乘,將會是一個非常小的數(shù)字。而梯度下降算法更新參數(shù)W完全依賴于梯度值(如BP算法),極小的梯度值失去了區(qū)分度,無法讓參數(shù)有效更新,該現(xiàn)象即為“梯度消失”(VanishingGradients)。

ReLU激活函數(shù)(Rectified Linear Unit,修正線性單元)的出現(xiàn)解決了梯度消失問題。如下圖所示,ReLU的公式是R(z)=max(0,z)。假設(shè)這個神經(jīng)元負責(zé)檢測一個具體的特征,例如曲線或者邊緣。若此神經(jīng)元在輸入范圍內(nèi)檢測到了對應(yīng)的特征,開關(guān)開啟,且正值越大代表特征越明顯;但此神經(jīng)元檢測到特征缺失,開關(guān)關(guān)閉,則不管負值的大小,如-6對比-2都沒有區(qū)分的意義。

Relu的優(yōu)勢是求導(dǎo)后,梯度只可以取0或1,輸入小于0時,梯度為0;輸入大于0時,梯度為1。在多層神經(jīng)網(wǎng)絡(luò)中Relu梯度的連續(xù)乘法不會收斂到0,結(jié)果也只可以取0或1;若值為1則梯度保持值不變進行前向傳播,若值為0則梯度從該位置停止前向傳播。

Relu神經(jīng)元死亡問題可以通過“小于0”部分優(yōu)

ReLU也有缺點,它提升了計算效率,但同樣可能阻礙訓(xùn)練過程。通常,激活函數(shù)的輸入值有一項偏置項(bias),若bias太小,輸入激活函數(shù)的值總是負的,那么反向傳播過程經(jīng)過該處的梯度總為0,對應(yīng)的權(quán)重和偏置參數(shù)無法得到更新。如果對于所有的樣本輸入,該激活函數(shù)的輸入都是負的,那么該神經(jīng)元再也無法學(xué)習(xí),稱為神經(jīng)元“死亡”問題(Dying ReLU Problem)。

Relu升級到LeakyReLU就是為了解決神經(jīng)元“死亡”問題。LeakyReLU與ReLU很相似,僅在輸入小于0的部分有差別,ReLU輸入小于0的部分值都為0,而LeakyReLU輸入小于0的部分,值為負,且有微小的梯度。使用LeakyReLU的好處就是:在反向傳播過程中,對于LeakyReLU激活函數(shù)輸入小于零的部分,也可以計算得到梯度,而不是像ReLU一樣值為0,這樣就避免了上述梯度方向鋸齒問題。超參數(shù)α的取值也被研究過,有論文將α作為了需要學(xué)習(xí)的參數(shù),該激活函數(shù)為PReLU(Parametrized ReLU)。

(4)如何選擇激活函數(shù)?

每個激活函數(shù)都有自己的特點,Sigmoid和tanh的將輸出限制在(0,1)和(-1,1)之間,適合做概率值的處理,例如LSTM中的各種門;而ReLU無最大值限制,則不適合做這個應(yīng)用,但是Relu適合用于深層網(wǎng)絡(luò)的訓(xùn)練,而Sigmoid和tanh則不行,因為它們會出現(xiàn)梯度消失。

選擇激活函數(shù)是有技巧的,如“除非在二分類問題中,否則小心使用Sigmoid函數(shù)”;“如果你不知道應(yīng)該使用哪個激活函數(shù), 那么請優(yōu)先選擇ReLU”。盡管ReLU有一些缺點,但參考“奧卡姆剃刀原理”,如無必要、勿增實體,也就是優(yōu)先選擇最簡單的方法,ReLU相較于其他激活函數(shù),有著最低的計算代價和最簡單的代碼實現(xiàn)。如果使用了ReLU,要注意一下DeadReLU問題。如優(yōu)化Learningrate,防止太高導(dǎo)致在訓(xùn)練過程中參數(shù)更新太大,避免出現(xiàn)大的梯度從而導(dǎo)致過多的神經(jīng)元“Dead”;或者針對輸入為負值時,ReLU的梯度為0造成神經(jīng)元死亡,更換激活函數(shù),嘗試一下leakyReLU等ReLU變體,說不定會有很好效果。

實際應(yīng)用時還是要看具體場景,甚至結(jié)合具體模型。比如LSTM中用到Tanh、Transfromer中用到的ReLU、Bert中用到的GeLU,YoLo中用到的LeakyReLU等。不同的激活函數(shù),根據(jù)其特點,應(yīng)用各不相同。

3、如何讓張量執(zhí)行計算?

(1)導(dǎo)入TensorFlow,并建立矩陣a、矩陣b、矩陣c,參考如下代碼

import tensorflow as tf

import numpy as np

a = tf.constant([[1, 2], [3, 4]])

b = tf.constant([[1, 1], [1, 1]])

c = tf.constant([[4.0,5.0], [10.0,1.0]])

(2)執(zhí)行張量的運算

張量的基本運算包括加法、乘法、獲取最大最小值等,常用函數(shù)有tf.add()、tf.multiply()、tf.matmul()、tf.reduce_max()等。乘法相關(guān)的兩個函數(shù),tf.multiply()是兩個矩陣中對應(yīng)元素各自相乘,而tf.matmul()執(zhí)行的是矩陣乘法,兩者有區(qū)別。

add

print(tf.add(a, b), “

”)

打印結(jié)果 》》》

tf.Tensor(

[[2 3]

[4 5]], shape=(2, 2), dtype=int32)

multiply

print(tf.multiply(a, b), “

”)

打印結(jié)果 》》》

tf.Tensor(

[[1 2]

[3 4]], shape=(2, 2), dtype=int32)

matrix multiply

print(tf.matmul(a, b), “

”)

打印結(jié)果 》》》

tf.Tensor(

[[3 3]

[7 7]], shape=(2, 2), dtype=int32)

max/min:find the largest/smallest value

print(tf.reduce_max(c))

打印結(jié)果 》》》

tf.Tensor(10.0, shape=(), dtype=float32)

(3)應(yīng)用激活函數(shù)

我們以tf.nn.sigmoid()、tf.nn.relu()等常用的激活函數(shù)為例,大家可以參考上文分享的公式驗計算驗證一下,看一下激活效果。

sigmoidprint(tf.nn.sigmoid(c))

打印結(jié)果 》》》

tf.Tensor(

[[0.98201376 0.9933072 ]

[0.9999546 0.7310586 ]], shape=(2, 2), dtype=float32)

reluprint(tf.nn.relu(c))

打印結(jié)果 》》》

tf.Tensor(

[[ 4. 5.]

[10. 1.]], shape=(2, 2), dtype=float32)

今天我們一起學(xué)習(xí)了如何在TensorFlow中執(zhí)行張量的計算,并重點討論一下不同的激活函數(shù),下一步我們繼續(xù)學(xué)習(xí)如何使用TensorFlow

審核編輯:郭婷


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

原文標題:深度學(xué)習(xí)框架(4)-TensorFlow中執(zhí)行計算,不同激活函數(shù)各有妙用

文章出處:【微信號:Hardware_10W,微信公眾號:硬件十萬個為什么】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    輸入文字轉(zhuǎn)化語音

    播報:語音助手:用戶可以聽取最新新聞、天氣預(yù)報等信息,實現(xiàn)信息的快速獲取等等。 三、業(yè)務(wù)步驟 第一步:輸入框輸入想轉(zhuǎn)化的文字 第二部:文字轉(zhuǎn)化成語音播報出來四、效果展示五:代碼展示: mport
    發(fā)表于 08-28 10:54

    利用Python腳本登錄到交換機創(chuàng)建VLAN

    本文將詳細介紹如何利用Python腳本登錄到交換機創(chuàng)建VLAN。
    的頭像 發(fā)表于 08-12 17:59 ?283次閱讀

    Groq籌資約3億美元,向Cerebras等對手看齊?

    這家由谷歌專屬芯片張量處理單元發(fā)明人之一的喬納森·羅斯于近8年前創(chuàng)建的公司,致力于研發(fā)可替代英偉達芯片的產(chǎn)品。據(jù)了解,包括Groq和Cerebras在內(nèi)的近20家AI芯片開發(fā)商已累計籌得超過55億美元。
    的頭像 發(fā)表于 05-23 15:49 ?391次閱讀

    深度解析Transformer技術(shù)原理

    張量是一個多維數(shù)組,可以看作是向量和矩陣的更底層的表示,向量和矩陣是張量的特例。例如向量是一維的張量,矩陣是二維的張量。張量可以有任意數(shù)量的
    發(fā)表于 04-19 12:33 ?725次閱讀
    深度解析Transformer技術(shù)原理

    將yolov5s的模型轉(zhuǎn)成.onnx模型,進行cube-ai分析時報錯的原因?

    報錯顯示張量不能大于四維的,想請教解決一下,我再此之后通過onnx-simplifier對.onnx進行簡化之后再通過cube-ai進行分析還是出現(xiàn)上述報錯,懇求指導(dǎo),謝謝您!
    發(fā)表于 03-15 06:54

    應(yīng)用大模型提升研發(fā)效率的實踐與探索

    對于模型訓(xùn)練,我們可以采用 3D 并行訓(xùn)練的方式來實現(xiàn)。將模型參數(shù)和梯度張量劃分為多個分區(qū),分配到不同 GPU 卡上進行計算。每張卡負責(zé)自己分區(qū)的梯度和參數(shù)更新工作,間隔時同步到其他卡上。這樣可以很好地利用更多計算資源,降低單卡資源需求。
    的頭像 發(fā)表于 02-22 11:47 ?511次閱讀
    應(yīng)用大模型提升研發(fā)效率的實踐與探索

    如何創(chuàng)建重疊的封裝文件

    。它使用多層次的抽象,允許開發(fā)人員實現(xiàn)數(shù)據(jù)的封裝和隱藏,確保訪問這些數(shù)據(jù)的方式是可控的。本文將詳細介紹創(chuàng)建重疊的封裝文件的步驟和最佳實踐。 確定需求 在創(chuàng)建重疊的封裝文件之前,我們首
    的頭像 發(fā)表于 01-07 16:51 ?431次閱讀

    HarmonyOS:使用MindSpore Lite引擎進行模型推理

    如果是第三方框架的模型,比如 TensorFlow、TensorFlow Lite、Caffe、ONNX 等,可以使用模型轉(zhuǎn)換工具轉(zhuǎn)換為.ms 格式的模型文件。 創(chuàng)建上下文,設(shè)置線程數(shù)、設(shè)備類型等參數(shù)
    發(fā)表于 12-14 11:41

    codeblocks怎么創(chuàng)建c文件

    ,雙擊打開。 步驟 2: 創(chuàng)建一個新的項目 當(dāng) CodeBlocks 打開后,你會看到一個歡迎頁面。你可以選擇“Create a new project”來創(chuàng)建一個新的項目。 步驟 3: 選擇項目模板
    的頭像 發(fā)表于 11-26 10:21 ?3427次閱讀

    C語言如何創(chuàng)建數(shù)組

    C語言是一種非常強大和靈活的編程語言,它提供了若干數(shù)據(jù)類型來存儲和操作數(shù)據(jù)。其中之一就是數(shù)組,它可以用來存儲一系列具有相同數(shù)據(jù)類型的元素。本文將詳細介紹如何在C語言中創(chuàng)建數(shù)組,探討數(shù)
    的頭像 發(fā)表于 11-24 10:08 ?1365次閱讀

    python循環(huán)創(chuàng)建變量賦值

    Python中如何使用循環(huán)創(chuàng)建變量賦值,以及它的一些應(yīng)用場景。 首先,讓我們來了解一下Python中的循環(huán)。Python提供了兩種常用的循環(huán)結(jié)構(gòu):for循環(huán)和while循環(huán)。for循環(huán)適合用于已知循環(huán)次數(shù)的情況,它通過遍歷一個可迭代對象中的元素來
    的頭像 發(fā)表于 11-23 14:51 ?1357次閱讀

    oracle創(chuàng)建用戶賦予權(quán)限

    Oracle是一種關(guān)系型數(shù)據(jù)庫管理系統(tǒng),用戶在Oracle中起著重要的作用,它們用于管理和訪問數(shù)據(jù)庫中的數(shù)據(jù)。在Oracle中,我們可以通過創(chuàng)建用戶賦予相應(yīng)的權(quán)限來對數(shù)據(jù)庫進行管理和控制。本文將
    的頭像 發(fā)表于 11-17 14:28 ?2098次閱讀

    瞬變對AI加速卡供電的影響

    圖形處理單元(GPU)、張量處理單元(TPU)和其他類型的專用集成電路(ASIC)通過提供并行處理能力來實現(xiàn)高性能計算,以滿足加速人工智能(AI)訓(xùn)練和推理工作負載的需求。
    的頭像 發(fā)表于 11-16 17:23 ?821次閱讀
    瞬變對AI加速卡供電的影響

    主流大模型推理框架盤點解析

    vLLM是一個開源的大模型推理加速框架,通過PagedAttention高效地管理attention中緩存的張量,實現(xiàn)了比HuggingFace Transformers高14-24倍的吞吐量。
    發(fā)表于 10-10 15:09 ?4365次閱讀
    主流大模型推理框架盤點解析

    GPU的張量核心: 深度學(xué)習(xí)的秘密武器

    GPU最初是為圖形渲染而設(shè)計的,但是由于其卓越的并行計算能力,它們很快被引入深度學(xué)習(xí)中。深度學(xué)習(xí)的迅速發(fā)展離不開計算機圖形處理單元(GPU)的支持,而GPU中的張量核心則被譽為深度學(xué)習(xí)的秘密武器
    的頭像 發(fā)表于 09-26 08:29 ?762次閱讀
    GPU的<b class='flag-5'>張量</b>核心: 深度學(xué)習(xí)的秘密武器