使用有限差分检查渐变

时间:2016-01-12 18:18:06

标签: machine-learning gradient gradient-descent

我正在调试我的约束随机梯度下降算法,文章http://research.microsoft.com/pubs/192769/tricks-2012.pdf建议使用有限差分检查梯度。我添加了惩罚函数,但模型不再收敛,所以我想按照文章中的建议检查我的渐变。

  1. 选择一个例子z。
  2. 计算当前w的损失Q(z,w)。
  3. 计算梯度g =∇wQ(z,w)。
  4. 轻微扰动w 0 = w +δ。例如,改变一个重量 通过小增量,或使用δ=-γg,其中γ足够小。
  5. 计算新损失Q(z,w0 并验证Q(z,w0 )≈Q(z,w)+δg
  6. 所以我可以选择一个例子来计算这个例子的丢失,但是我的权重向量包含~4000个特征,所以我得到了一个很多偏导数的向量作为我的渐变而丢失是一个整数,所以它不是可以计算Q(z,w)+δg。我是否必须计算w的单个特征的损失?这是“现在的W”的意思吗?

1 个答案:

答案 0 :(得分:0)

该出版物中的等式看起来很奇怪,因为它没有仔细描述。为了检查渐变,您通常会检查“猜测”渐变i和之间的差异 数值梯度,( Q(z, w + delta*e_i) - Q(z, w) ) / ( delta ) 维度等于

delta

足够小e_i,而ii规范向量(g_i维上为1,否则为0)足够小。换句话说,如果我们用i表示渐变的| ( Q(z, w + delta*e_i) - Q(z, w) ) / ( delta ) - g_i | < eps | Q(z, w + delta*e_i) - Q(z, w) - delta * g_i | < delta*eps 维,那么你需要检查是否

| Q(z, w + delta*e_i) - ( Q(z, w) + delta * g_i ) | < delta*eps

归结为检查

Q(z, w + delta*e_i) ≈ ( Q(z, w) + delta * g_i )

因此检查是否

private TileOverlay mTiles;
private String MAP_URL_FORMAT = "file:///android_asset/%d/x%d_y%d.png";
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.tile_overlay);

    SupportMapFragment mapFragment =
            (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);
}

@Override
public void onMapReady(GoogleMap map) {
    map.setMapType(GoogleMap.MAP_TYPE_HYBRID);
    LatLng supperland = new LatLng(31.978574, 34.744219);
    map.moveCamera(CameraUpdateFactory.newLatLngZoom(supperland, 9));


    TileProvider tileProvider = new UrlTileProvider(256, 256) {
        @Override
        public synchronized URL getTileUrl(int x, int y, int zoom) {

            String s = String.format(Locale.US, MAP_URL_FORMAT, zoom, x, y);
            URL url = null;

                    try {
                        url = new URL(s);
                    } catch (MalformedURLException e) {
                        throw new AssertionError(e);
                    }

            return url;
        }
    };

    mTiles = map.addTileOverlay(new TileOverlayOptions().tileProvider(tileProvider));
}

这是他们的等式,只需功能