深度學習中的數(shù)學(一)——高等數(shù)學
一、初等函數(shù)與基本初等函數(shù)
1.1 基本初等函數(shù)
關鍵詞:值域、定義域、單調性、對稱性、飽和性、周期性、奇偶性、連續(xù)性、變化趨勢(從圖像上來看)
1.1.1 常函數(shù)
y=c
1.1.2 冪函數(shù)
y=x^α(α為有理數(shù))
Nump與Pytorch的轉換
import?numpy?as?np
import?torch
a?=?torch.tensor(1)
b?=?np.array(1)
print(type(a))#?<class?'torch.Tensor'>
print(type(b))#?<class?'numpy.ndarray'>
c?=?a.numpy()
d?=?torch.from_numpy(b)
print(type(c))#?<class?'numpy.ndarray'>
print(type(d))#?<class?'torch.Tensor'>
1.1.3 指數(shù)函數(shù)
兩個函數(shù)可以組合,組成類似二次函數(shù)的圖像 
1.1.4 對數(shù)函數(shù)
對數(shù)函數(shù)與指數(shù)函數(shù)關于y=x對稱。ping值可以測試網(wǎng)絡
作用:(1)簡化計算(連乘變連加;指數(shù)變乘法) (2)壓縮空間 (3)魯棒性(可以借助分類圖像理解) 
1.1.5 三角函數(shù)與反三角函數(shù)
余弦函數(shù) cos x, 反余弦函數(shù) arccos x
余弦函數(shù) cos x, 反余弦函數(shù) arccos x
正切函數(shù) tan x, 余切函數(shù) cot x
正切函數(shù) tan x, 余切函數(shù) cot x
反正切函數(shù) arctan x, 反余切函數(shù) arccot x
余割函數(shù)csc x
正割函數(shù) sec x
matplotlib畫對數(shù)函數(shù)的圖像
import?numpy?as?np
import?matplotlib.pyplot?as?plt
x?=?np.arange(0.1,10,0.1)
y?=?np.log(x)
y2?=?np.zeros_like(x)
plt.plot(x,y,x,y2)
plt.show()

2.由基本初等函數(shù)構成的復合函數(shù)被稱為初等函數(shù)
2.1 Sigmoid與tanh

2.2 重要的特殊的函數(shù)

三、反函數(shù)
最具有代表性的反函數(shù)就是對數(shù)函數(shù)與指數(shù)函數(shù)。反函數(shù)的定義域、值域分別是函數(shù)y=f(x)的值域、定義域。
四、凸函數(shù)與凸集(凸優(yōu)化問題)
凸函數(shù)就是一個定義在某個向量空間的凸子集C(區(qū)間)上的實值函數(shù)。(隨意取兩點,值都在函數(shù)上方)
凸集:在歐氏空間中,凸集是對于集合內的每一對點,連接該對點的直線段上的每個點也在該集合內。
包絡函數(shù):隨意一個函數(shù)圖像,將其包起來,就是一個凸函數(shù)。
五、對偶函數(shù)
找到所求函數(shù)的對偶函數(shù),此函數(shù)的最高點就是接近所求函數(shù)的最低點。對偶函數(shù)一定是凹函數(shù)呢。
六、優(yōu)化問題
拉格朗日乘子法 優(yōu)化兩個方面:損失與正則項 
七、極限
7.1 極限定義

7.2 重要極限(金融的復利問題)

八、導數(shù)與梯度
導數(shù) = -梯度
8.1 導數(shù)
8.1 定義

8.2 導數(shù)的幾何意義

8.3 基本導數(shù)公式

8.4 偏導與全導
全導:偏導求和。

8.5 二階導數(shù)

拓展:黑塞矩陣:利用黑塞矩陣判定多元函數(shù)的極值 黑塞矩陣(Hessian Matrix),又譯作海森矩陣、海瑟矩陣、海塞矩陣等,是一個多元函數(shù)的二階偏導數(shù)構成的方陣,描述了函數(shù)的局部曲率。黑塞矩陣最早于19世紀由德國數(shù)學家Ludwig Otto Hesse提出,并以其名字命名。黑塞矩陣常用于牛頓法解決優(yōu)化問題,利用黑塞矩陣可判定多元函數(shù)的極值問題。在工程實際問題的優(yōu)化設計中,所列的目標函數(shù)往往很復雜,為了使問題簡化,常常將目標函數(shù)在某點鄰域展開成泰勒多項式來逼近原函數(shù),此時函數(shù)在某點泰勒展開式的矩陣形式中會涉及到黑塞矩陣。
8.6 復合函數(shù)的導數(shù)
復合函數(shù)對自變量的導數(shù),等于已知函數(shù)對中間變量的導數(shù),乘以中間變量對自變量的導數(shù)(鏈式法則)。
8.7 高階導數(shù)意義
一階導決定增減 二階導決定凹凸 三階導決定偏度(以y=x^3為例理解:凸的快慢)
8.8 泰勒級數(shù)
泰勒級數(shù)用無限項連加式——級數(shù)來表示一個函數(shù),這些相加的項由函數(shù)在某一點的導數(shù)求得。
稱為f(x)在點x0處的泰勒級數(shù)。
九、梯度下降法(Gradient Descent,GD)
關于梯度下降,這篇文章很有深度:
9.1 理解梯度下降法
首先,梯度下降法是一種常用的求解無約束最優(yōu)化問題的方法。
前提:我們所要優(yōu)化的函數(shù)必須是一個連續(xù)可微的函數(shù),可微,既可微分,意思是在函數(shù)的任意定義域上導數(shù)存在。
一個例子理解梯度下降法:
假設這樣一個場景:一個人需要從山的某處開始下山,盡快到達山底。在下山之前他需要確認三件事:出發(fā)點、下山的方向、下山的距離。山代表了需要優(yōu)化的函數(shù)表達式;山的最低點就是該函數(shù)的最優(yōu)值,也就是我們的目標;每次下山的距離代表后面要解釋的學習率;尋找方向利用的信息即為樣本數(shù)據(jù);最陡峭的下山方向則與函數(shù)表達式梯度的方向有關,之所以要尋找最陡峭的方向,是為了滿足最快到達山底的限制條件。
9.2 梯度下降法的基本方法
批量梯度下降法(Batch Gradient Descent, BGD)
批量梯度下降法每次學習都使用整個訓練集,因此每次更新都會朝著正確的方向進行,最后能夠保證收斂于極值點,凸函數(shù)收斂于全局極值點,非凸函數(shù)可能會收斂于局部極值點,缺陷就是學習時間太長,消耗大量內存。
小批量梯度下降法(Mini-batch Gradient Descent, MBGD)
如果Batch Size選擇合理,不僅收斂速度比SGD更快、更穩(wěn)定,而且在最優(yōu)解附近的跳動也不會很大,甚至得到比Batch Gradient Descent 更好的解。
隨機梯度下降法(Stochastic Gradient Descent, SGD)
SGD一輪迭代只用一條隨機選取的數(shù)據(jù),盡管SGD的迭代次數(shù)比BGD大很多,但一次學習時間非??臁GD的缺點在于每次更新可能并不會按照正確的方向進行,參數(shù)更新具有高方差,從而導致?lián)p失函數(shù)劇烈波動。收斂時浮動,不穩(wěn)定,在最優(yōu)解附近波動,難以判斷是否已經收斂。
Momentum梯度下降法(帶動量的梯度下降法)
SGD、BSGD兩種改進方法都存在不同程度的震蕩;從可視圖表現(xiàn)來看,就是頻繁更改方向,所以,如果能夠把之前下降的方向考量進來,那么將會減少振蕩。
NAG梯度下降法(Nesterov Accelerated Gradient)
不僅僅把SGD梯度下降以前的方向考慮,還將Momentum梯度變化的幅度也考慮了進來。
9.3 局部最優(yōu)解
鞍點:
9.4 BP算法性能優(yōu)化
批量 學習率 動量 Adam優(yōu)化器
9.5 微分積分幾何意義

十、代碼
10.1 計算梯度
import?torch
x?=?torch.tensor([3.0],requires_grad=True)
y?=?x**3
y.backward(retain_graph=True)
print(x.grad)#?tensor([27.])
#?print(torch.autograd.grad(y,x))#?#?(tensor([27.]),)
10.2 梯度下降法擬合一條直線
import?random
import?numpy?as?np
def?sigmoid(x):
????return?1?/?(1?+?np.exp(-x))
_x?=?[i/100?for?i?in?range(100)]
_y?=?[sigmoid(5*i?+?3)?for?i?in?_x]
#?print(_x)
#?print(_y)
#?y?=?w?*?x?+?b
#?回歸的問題
w?=?random.random()
b?=?random.random()
for?i?in?range(100000):
????for?x,y?in?zip(_x,_y):
????????z?=?w?*?x?+?b
????????a?=?sigmoid(z)
????????loss?=?(a?-?y)?**?2
????????#?求導
????????dw?=?2*(a-y)?*?(a*(1-a))?*?x
????????db?=?2*(a-y)?*?(a*(1-a))
????????#?更新參數(shù)
????????w?=?w?-?0.4*dw
????????b?=?b?-?0.4*db
????????print(w,b,loss)
10.3 BP算法的簡單實現(xiàn)
①
import?torch
import?torch.nn?as?nn
xs?=?torch.arange(0.01,1,0.01)
ys?=?3*xs+4+torch.randn(99)/100
class?Line(nn.Module):
????def?__init__(self):
????????super().__init__()
????????self.w?=?nn.Parameter(torch.randn(1))
????????self.b?=?nn.Parameter(torch.randn(1))
????def?forward(self,x):
????????return?self.w*x+self.b
if?__name__?==?'__main__':
????line?=?Line()
????opt?=?torch.optim.SGD(line.parameters(),lr=0.01)
????for?epochs?in?range(50):
????????for?x,y?in?zip(xs,ys):
????????????z?=?line(x)
????????????loss?=?(z-y)**2
????????????opt.zero_grad()
????????????loss.backward()
????????????opt.step()
????????????print(loss)
????print(line.w)
????print(line.b)
②
import?torch
w?=?torch.tensor([9.],?requires_grad=True)
print(w.dtype)
#?BP?優(yōu)化器?更新參數(shù)?w?0.01
optimer?=?torch.optim.SGD([w],?lr=0.075)
for?i?in?range(100):
????loss?=?(w?-?2.3)?**?2??#?36?->?0
????optimer.zero_grad()?#?清空梯度(梯度會累加,所以必須要清空)
????loss.backward()
????optimer.step()?#?更新參數(shù)
????print(w,?loss)


Python“寶藏級”公眾號【Python之王】專注于Python領域,會爬蟲,數(shù)分,C++,tensorflow和Pytorch等等。
近 2年共原創(chuàng) 100+ 篇技術文章。創(chuàng)作的精品文章系列有:
日常收集整理了一批不錯的?Python?學習資料,有需要的小伙可以自行免費領取。
獲取方式如下:公眾號回復資料。領取Python等系列筆記,項目,書籍,直接套上模板就可以用了。資料包含算法、python、算法小抄、力扣刷題手冊和 C++ 等學習資料!
