写在前面:本篇读书笔记属于《深度学习原理与Pytorch实战》张伟振,清华大学出版社, 属于本书第三章节。笔者邮箱:pinecypressfxd@outlook.com欢迎学习讨论。
深度学习需要一些必要的数学知识。以下介绍原理的同时使用代码展示。
深度学习中的实用数学
线性代数
向量
n个数组成的有序数组,称为维度为n的向量。
内积可以衡量两个向量之间的相似程度
import numpy as np
v1 = [1,2,3,4,5]
v2 = [1,2,3,4,5]
# 内积
v3 = np.array(v1)*np.array(v2)
v3
array([ 1, 4, 9, 16, 25])
矩阵
由m*n个数排成的m行n列的数表成为m行n列的矩阵。简称m*n。
matrix = [[0,1,2],
[3,4,5],
[6,7,8]]
矩阵乘法:C=AB,A的行向量与B的列向量的内积。
高等数学
函数
函数的极限
def limit(fx, x0, delta = 0.0001, sigma = 0.01):
right_limit = fx(x0 + delta)
left_limit = fx(x0 - delta)
# 若左极限等于右极限,则极限存在?
if abs(right_limit - left_limit)<sigma:
return right_limit
def f(x):
return x**x
print(limit(f,2))
4.000677326211935
import math
def f2(x):
return math.log(math.cos(x-1))/(1-math.sin(math.pi * x / 2))
print(limit(f2 , 1))
-0.40528473223537537
导数
导数是一个极限。瞬时变化率。
def derivative(fx, x0, delta_x=0.00001, allow_miss = 0.01):
right_derivative = (fx(x0 + delta_x) - fx(x0))/(delta_x)
left_derivative = (fx(x0 - delta_x) - fx(x0))/(-delta_x)
if abs(right_derivative - left_derivative)<allow_miss:
return right_derivative
def f(x):
return x*x + 2*x +1
print(derivative(f,5))
12.000009999724169
导函数
泰勒公式
f ( x ) ≃ ∑ i = 0 n f ( n ) ( x 0 ) n ! ( x − x 0 ) n f(x) ≃ \sum_{i=0}^n \frac{f^{(n)}(x_0)}{n!}(x-x_0)^{n} f(x)≃∑i=0nn!f(n)(x0)(x−x0)n
# 求e^x
import math
def exp(x, allow_miss = 0.0001):
result = 1 + x
n = 2
while(x**n)/math.factorial(n)>allow_miss:
result += x**n/math.factorial(n)
n+=1
return result
math.factorial
print(exp(1))
2.7182539682539684
偏导数
在一个神经网络中有大量的参数,我们需要用到偏导数的概念
∂
f
(
x
1
,
x
2
,
.
.
.
,
x
n
)
∂
x
i
\frac{∂f(x_1,x_2,...,x_n)}{∂x_i}
∂xi∂f(x1,x2,...,xn),衡量点x处只有
x
i
x_i
xi变化时
f
(
x
)
f(x)
f(x)如何变化。
def partial_derivative(fx, x:list, delta_xi = 0.00001, allow_miss = 0.01):
result = []
for i,e in enumerate(x):
x_ = x.copy()
x_[i] = e + delta_xi
right_derivative = (fx(x_) - fx(x))/(delta_xi)
x_[i] = e - delta_xi
left_derivative = (fx(x_) - fx(x))/(-delta_xi)
if abs(right_derivative - left_derivative)<allow_miss:
result.append(right_derivative)
return result
# 测试代码使用sum,所有xi的偏导数均为1.
def f(x: list):
sum = 0
for e in x:
sum += e
return sum
print(partial_derivative(f,[1,2,3,4,5]))
[0.9999999999621422, 0.9999999999621422, 0.9999999999621422, 0.9999999999621422, 0.9999999999621422]