2.7计算图:
一个神经网络的计算,都是按照前向或反向传播过程组织的。我们需要计算出一个新的网络的输出(前向过程),紧接着进行一个反向传输操作。计算图解释了为什么我们用这种方式组织这些计算过程
如下图计算函数 J ,J是由三个变量 a , b , c 组成的函数,这个函数是 3 ( a + b c ) 。计算这个函数实际上有三个不同的步骤,首先是计算 b 乘以 c ,我们把它储存在变量 u中,因此 u = b c u ; 然后计算 v = a + u v ;最后输出 J = 3 v ,这就是要计算的函数 J 。我们可以把这三步画成如下的计算图,我先在这画三个变量 a , b , c ,第一步就是计算 u = b c u ,我在这周围放个矩形框,它的输入是 b , c ,接着第二步 v = a + u v,最后一步 J = 3 v 。 举个例子: a = 5 , b = 3 , c = 2 , u = b c u 就是6, , v = a + u v 就是5+6=11。 J 是3倍的 ,因此。即 3 ∗ ( 5 + 3 ∗ 2 ) 。如果你把它算出来,实际上得到33就是 J的值。 当有不同的或者一些特殊的输出变量时,例如本例中的 J 和逻辑回归中你想优化的代价函数 J,因此计算图用来处理这些计算会很方便。从这个小例子中我们可以看出,通过一个从左向右的过程,你可以计算出的 J。为了计算导数,从右到左(红色箭头,和蓝色箭头的过程相反)的过程是用于计算导数最自然的方式。
Logistic 回归的梯度下降法:
假设样本只有两个特征 x1和x2,为了计算z输入参数 和和b、特征值x1和x2。
逻辑回归的公式定义如下:
损失函数:
代价函数:
单个样本的代价函数:
w和b的修正:
在这个公式的外侧画上长方形。然后计算: 也就是计算图的下一步,最后计算损失函数。有了计算图,就不需要再写出公式了。因此,为了使得逻辑回归中最小化代价函数只需要修改参数 w 和 b 的值。
通过微积分得到:
求得:
计算 w 和 b 变化对代价函数 L 的影响:
使用计算 ,使用计算以及
得,,。
m 个样本的梯度下降:
初始化
代码流程:
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
此方法在逻辑回归上需要编写两个for循环。第一个for循环是一个小循环遍历 m 个训练样本,第二个for循环是一个遍历所有特征的for循环。2个特征,n就等于2,如果有更多特征就要从一直算到
在代码中显式地使用for循环使算法很低效,同时在深度学习领域会有越来越大的数据集。所以能够应用算法且没有显式的for循环会是重要的,并且会适用于更大的数据集。向量化技术可以允许代码摆脱这些显式的for循环。
向量化:
向量化是非常基础的去除代码中for循环的艺术,在深度学习安全领域、深度学习实践中
所以如果使用非向量化方法去计算,代码如下:
x
z=0
for i in range(n_x)
z+=w[i]*x[i]
z+=b
很慢
z=np.dot(w,x)+b这是向量化计算的方法,非常快。