注:本人已经学完了吴恩达老师机器学习和深度学习的全部课程,整理出来的知识点是比较笼统的、自己总结的一些结论和经验,发在这里主要是为了方便自己复习翻阅,已经学完大部分课程或者对深度学习有了一定基础的uu可以阅读下~欢迎批评指正。
L ( y ^ , y ) = − y log ( y ^ ) − ( 1 − y ) log ( 1 − y ^ ) L(\hat{y}, y)=-y \log (\hat{y})-(1-y) \log (1-\hat{y}) L(y^,y)=−ylog(y^)−(1−y)log(1−y^) J ( w , b ) = 1 m ∑ i = 1 m L ( y ^ ( i ) , y ( i ) ) = 1 m ∑ i = 1 m ( − y ( i ) log y ^ ( i ) − ( 1 − y ( i ) ) log ( 1 − y ^ ( i ) ) ) J(w, b)=\frac{1}{m} \sum_{i=1}^{m} L\left(\hat{y}^{(i)}, y^{(i)}\right)=\frac{1}{m} \sum_{i=1}^{m}\left(-y^{(i)} \log \hat{y}^{(i)}-\left(1-y^{(i)}\right) \log \left(1-\hat{y}^{(i)}\right)\right) J(w,b)=m1i=1∑mL(y^(i),y(i))=m1i=1∑m(−y(i)logy^(i)−(1−y(i))log(1−y^(i)))
J=0;dw1=0;dw2=0;db=0;
for i = 1 to m
z(i) = wx(i)+b;
a(i) = sigmoid(z(i));
J += -[y(i)log(a(i))+(1-y(i))log(1-a(i));
dz(i) = a(i)-y(i);
dw1 += x1(i)dz(i);
dw2 += x2(i)dz(i); # 导数
db += dz(i);
J/= m;
dw1/= m;
dw2/= m; # 取平均
db/= m;
w=w-alpha*dw
b=b-alpha*db
z=0
for i in range(n_x)
z+=w[i]*x[i]
z+=b
w T ^{T} TX 向量化:z=np.dot(w,x)+b
import numpy as np # 导入 numpy 库
a = np.array([1,2,3,4]) # 创建一个数据 a
print(a)
# [1 2 3 4]
import time #导入时间库
a = np.random.rand(1000000)
b = np.random.rand(1000000)
#通过 round 随机得到两个一百万维度的数组
tic = time.time() #现在测量一下当前时间
#向量化的版本
c = np.dot(a,b)
toc = time.time()
print(“Vectorized version:” + str(1000*(toc-tic)) +”ms”)
#打印一下向量化的版本的时间
#继续增加非向量化的版本
c = 0
tic = time.time()
for i in range(1000000):
c += a[i]*b[i]
toc = time.time()
print(c)
print(“For loop:” + str(1000*(toc-tic)) + “ms”)
#打印 for 循环的版本的时间
当我们在写神经网络程序时,或者在写逻辑(logistic)回归,或者其他神经网络模型时,应该避免写循环(loop)语句。虽然有时写循环(loop)是不可避免的,但是我们可以使用比如numpy 的内置函数或者其他办法去计算。
import numpy as np
A=np.array ([[56.0,0.0,4.4,68.0],
[1.2,104.0,52.0,8.0],
[1.8,135.0,99.0,0.9]])
cal=A.sum(axis=0)
percentage=100*A/cal.reshape(1,4)
print(percentage)
举个例子,设置 = . . (5)
,这样会生成存储在数组 中的 5 个高斯随机数变量。之后输出 ,从屏幕上可以得知,此时 的 shape(形状)是一个(5, )
的结构。这在 Python 中被称作一个一维数组
。它既不是一个行向量也不是一个列向量。
当你编写神经网络时,不要在它的 shape 是(, )即一维数组时使用数据构。应当设置 为(5,1)。如下图所示:
(5,1)
矩阵-向量和一维数组(5,)
-非向量的差别。如果你输出 (5,1)和 (5,1) 转置的乘积,会返回给你一个向量的外积,这两个向量的外积返回给你的是一个5×5矩阵。(5,)
。如果不完全确定一个向量的维(dimension),老师经常会扔进一个断言语句(assertion statement):assert(a.shape==(5,1))
,像这样,去确保在这种情况下是一个(5,1)向量,即一个列向量。这些断言语句是要去执行的,并且它们也会有助于为你的代码提供信息。所以不论你要做什么,不要犹豫直接插入断言语句。如果你不小心以一维数组来执行,你也能够重新改变数组维数 = ℎ(×,×)建议:如果不确定哪一个激活函数效果更好,可以把它们都试试,然后在验证集或者发展集上进行评价。然后看哪一种表现的更好,就去使用它。如果仅仅遵守使用默认的ReLu 而不用其他的激励函数,那就可能在近期或者往后,每次解决问题的时候都使用相同的办法。
当你训练神经网络时,权重随机初始化是很重要的。对于逻辑回归,把权重初始化为 0,当然也是可以的。但是对于一个神经网络,如果你把权重或者参数都初始化为 0,那么梯度下降将不会起作用。
你应该这么做:把 [ 1 ] ^{[1]} [1]设为np.random.randn(2,2)
(生成高斯分布),通常再乘上一个小的数,比如 0.01,这样把它初始化为很小的随机数。没有对称的问题( symmetry breaking problem),所以可以把 初始化为 0,因为只要随机初始化你就有不同的隐含单元计算不同的东西,因此不会有 symmetry breaking 问题了。相似的,对于 [ 2 ] ^{[2]} [2]你可以随机初始化, [ 2 ] ^{[2]} [2]可以初始化为 0.
你也许会疑惑,这个常数从哪里来,为什么是 0.01,而不是 100 或者 1000。我们通常倾向于初始化为很小的随机数。因为如果你用 tanh 或者 sigmoid 激活函数,如果很大,数值波动太大,就会很大。就会很大或者很小,因此这种情况下你很可能停在tanh/sigmoid 函数的平坦的地方,这些地方梯度很小也就意味着梯度下降会很慢,因此学习也就很慢。
但当你训练一个非常非常深的神经网络,你可能会选择一个不同于的常数而不是 0.01,见下一大块。
总结:毫无关系