反向传播的些许思考
1 先看下面的关于概率计算的一个例子
科技袁人视频
先看问题:有A、B两位球员分别参加了大师赛和菜鸟赛,(这两个赛事无论从哪个看都是球员A更优秀,可是统计结果却显示球员B比球员A更优秀,这时为什么?是我们经常用的统计学原理出错啦? 辛普森悖论
(10/80):代表球员参加了80场赛,总共胜了10场
球员A | 球员B | |
---|---|---|
大师赛 | 10% (8/80) | 5% (1/20) |
菜鸟赛 | 100% (20/20) | 50% (40/80) |
统计 | 28% (28/100) | 41% (41/100) |
2:引入积分
通过引入积分来解决这个问题,就是分别对大师赛、菜鸟赛的胜率乘以积分得出一个(0-1)的结果!你看我们用统计,简单的乘除还是能够很优秀的处理这类问题的嘛!
球员A | 球员B | 积分 | |
---|---|---|---|
大师赛 | 10% (8/80) | 5% (1/20) | 0.8 |
菜鸟赛 | 100% (20/20) | 50% (40/80) | 0.2 |
统计 | 0.28 | 0.14 |
3:二项式小球问题
然后我们来看这个问题
(1/4):表示容器中有4个小球,在某次事件中小于等于1个小球发生的概率
容器A | 容器B | 积分 | |
---|---|---|---|
小球占比 | 25% (1/4) | 25% (2/8) | 25% (200/800) |
统计 |
我们看到小球占比一致的情况下,统计的概率也会有较大的偏差,在小球个数很大的情况下,概率可以用正态分布的函数求出来,这时我们以前常用的方法就再也不实用了。
正太分布图
4: 引入函数(分子内部的激烈程度,或者可以把它想象为灯的亮度)
熵的概念最早起源于物理学,用于度量一个热力学系统的无序程度。在信息论里面,熵是对不确定性的测量
前面写了那么多东西只是为了启发你为什么要引入下面这个公式:
- ps: 图中的log是用以2为底进行绘制的
请看下面这个图,他跟正太分布函数近似,我们可以把它看做分子内部的激烈程度的一个函数,当容器中的小球刚好到一半的时候,分子的激烈重度最强,或者说这个状态下的不确定性最大
5: 反向传播
6: 为什么引入sigmoid函数
通过这个方程的引入,我们可以把任何实数限制到0-1内
7 一个简单的实例
随机生成一个100*3的输入,用一个3*1的theta对它进行一次变换,,运用反向传播的方法逼近theta的值,最小化J
当然这个问题可以用最小二乘的方法一步到位的求出来,写这个代码的目的,是为了思考
- sigmoid的偏导为什么是 f(x)*(1-f(x)
- theta 为什么是这么更新 lamda * x' * g
- J 在吴恩达的教程中明明不是这么表达的!为什么吴恩达的那个公式不妥!应用条件是什么
clear all;clc;
x = rand(1000,3);
m = length(x);
lamda = 0.01;
theta = rand(3,1);
z = x*theta;
y = 1./(1+exp(-z));
theta_start = [0.2; 0.3; 0.4];
n_feature = length(theta_start);
period = 100;
save_theta = zeros(n_feature , period);
for i = 1:period
new_z = x * theta_start;
p_y = 1./(1+exp(-new_z));
% 输出偏差平方和
J(i) = (y - p_y)'*(y-p_y)/2/m ;
%f(x)的偏导是f(x)*(1-f(x))
diff_fx = p_y.*(1-p_y);
%输出的对theta的偏导为
g = (y-p_y).*diff_fx ;
%对theta进行更新
theta_start = theta_start + lamda * x' * g;
save_theta(:,i) = theta_start;
end
j = 1:period;
figure(1);
hold on
plot(j, J*m /5)
plot([1 1 1;period period period],[theta theta]')
plot([j; j; j]' , save_theta')
hold off
8 吴恩达视频教程的作业
t1_slide = Theta1(2:end);
t2_slide = Theta2(2:end);
add_slide = sum(sum(t1_slide.^2,1),2) + sum(sum(t2_slide.^2, 1),2) ;
add_slide = add_slide * lambda/ 2/ m;
a1_add = [ones(size(X,1),1) X];
z2 = a1_add * transpose(Theta1);
a2 = 1 ./ (1 + exp(-z2)) ;
a2_add = [ones(size(a2,1),1) a2];
z3 = a2_add * transpose(Theta2);
a3 = 1 ./ (1 + exp(-z3)) ;
real_y = zeros(size(z3));
for i = 1:m
index = y(i);
real_y(i, index) = 1;
end