梯度下降矢量化计算尺寸不正确

时间:2016-05-19 20:36:00

标签: matlab machine-learning neural-network gradient-descent

我有1个输入图层,2个隐藏图层和1个输出图层,对于单个训练示例x,输出y我计算了以下内容:

x = [1;0;1]; 
y = [1;1;1]; 

    theta1 =

        4.7300    3.2800    1.4600
             0         0         0
        4.7300    3.2800    1.4600

    theta2 =

        8.8920    8.8920    8.8920
        6.1670    6.1670    6.1670
        2.7450    2.7450    2.7450

    theta3 =

        9.4460    6.5500    2.9160
        9.3510    6.4850    2.8860
        8.8360    6.1270    2.7270

theta1控制输入层和layer1之间的映射 theta2控制layer1和layer2之间的映射 theta3控制第2层和输出层之间的映射

但要使用以下方法计算梯度下降: theta(i) = theta(i) - (alpha/m .* (x .* theta(i)-y)' * x)'其中i = 1或2或3,x和y的维度不正确。如果x和y是1x9而不是1x3,那么尺寸是正确的(通过正确我的意思是可以执行theta计算而没有错误)。我是否需要更改神经网络的架构,或者我可以将x和y设置为
    x = [1; 0; 1; 0; 0; 0; 0; 0; 0];     y = [1; 1; 1; 0; 0; 0; 0; 0; 0];矩阵乘法算出来了?

更新:

alpha=learning rate (.00001)
m=number of training examples (1)
theta(i) refers to theta1,theta2,theta3

我使用矢量化梯度下降,如Vectorization of a gradient descent code

所述

Update2:

这个matlab代码似乎有效:

m = 1; 
alpha = .0000001; 
x = [1;0;1]; 
y = [1; 1; 1]; 
theta1 = [4.7300 3.2800 1.4600; 0 0 0; 4.7300 3.2800 1.4600]; 
theta1 = theta1 - (alpha/m) * (x' * (theta1 * x - y));

theta1 = theta1 - (alpha/m) * (x' * (theta1 * x - y));矢量化梯度下降的正确实现吗?

我理解这会导致将θ矩阵展开到θ向量的问题,因为维度不会相同但是使用theta矩阵代替theta向量这是正确的吗?

更新: 公式从Vectorization of a gradient descent code修改 其中梯度下降的位置为:theta = theta - (alpha/m) * (X' * (X*theta-y));我将其更改为theta = theta - (alpha/m) * (x' * (theta * x - y));,因此(X*theta-y);更改为(theta * x - y);

1 个答案:

答案 0 :(得分:0)

在您引用的post中,X是一个包含m行(训练样本数)的矩阵。在您的情况下,m = 1,因此X成为行向量。在初始化时,x是列向量。因此,最简单的更改是设置x = x'y = y',以便输入和输出都成为行向量。

公式仍然是

theta3 = theta3 - (alpha/m) * (x' * (x*theta3-y)) = 
  9.4458   6.5499   2.9160
  9.3510   6.4850   2.8860
  8.8358   6.1269   2.7270

theta2和theta1的更新规则类似。

此外,错误字词x*theta3-y的形状与输入x的形状相同;原始更新金额x' * (x*theta3-y)的形状始终与theta3相同。