Jun 30, 2009

CRF2D

MRF, CRF 中,data term energy, smooth term energy 的参数是公用的。因此参数一般不会很多。

How to use the CRF2D toolbox

potential 即 exp{\theta^T \phi(x,y)}

NOTE: crf2d 用于 manmade testErr 并没有多大变化,这样能说有用吗?虽然 training 时,neg LL 是下降的。

本软件的限制:
1 CRF2D 要求 p(x) 为 exponential family,及要求 energy 为 w^T \phi (simoid 不属于此列?)
而 manMade ICCV03 中采用了 sigmoid,不能用 CRF2D 求。
2.  infer 是通用的。smd, stochastic gradient descent 好像也是通用的。
3. 其他都默认 labels 是 +1/-1
4. 对于一个新的问题,要建立自己的 feature engine, src gradient 函数,计算 potential 和gradient, 调用通用的 infer 和 smd

kv_try_3labels.m

demoSingle, 单个 sample
y: label
x: noisy

采用四种方法估计 weight
random, pseudo-likelihood, MF, LBP
就是单个最小化 sample 的 (pseudo)likelihood

然后采用得到的weights,用 MF 来infer y


demoMulti
实际上也是单个 sample
x 有多个,为加不同的 Noise

问题:
BP 是如何利用的。
BP 可以用于计算近似的 Log-partition (BFGS requires function value, i.e.,  log p(y|x)p(x) which included log-partition), expected feature (needed in gradient).

Learning rate in Stochastic Gradient Descent:
Stochastic Gradient Descent 不保证 loss 是递减的,大的 learning rate 会出现大的波动
0.0001~0.0005 是比较适合的


traindata.nodeLabels 这一项除了提供 size 信息外,在 gradient 计算的时候要用。

步骤

1. 建立 traindata/testdata
traindata.nodeFeatures = mkNodeFeatures(featureEng,trainFeatures);
traindata.edgeFeatures = mkEdgeFeatures(featureEng,trainFeatures);
traindata.nodeLabels = repmat(label,[1 1 length(trainNdx)]);
traindata.ncases = length(trainNdx);

nodeFeatures 和 edgeFeatures 和 label 无关,仅仅是 h(x) 参见 manMade 论文

2. learning weights (包含 initiate weights), 采用 SMD, SGD 或者 BFGS 等等,learning 需要用到 inference, 即第 3 步
3. enterEvidence, mkPotentials, infer
featureEng = enterEvidence(featureEng, testdata,i);
[nodePot, edgePot] = mkPotentials(featureEng, weights); %
[nodeBel, MAPlabels] = infer(infEng, nodePot, edgePot);

上面的 potential 遍历了 nodes 的 labels.即把所有labels 的potentials 都求出来,再进行 Infer
% nodePot(r,c,q) row col, q is the number of labels
% edgePot(q,q,ed) for e=1:num DIRECTED edges



综述:对于一个新的问题,先学习参数,再 test (inference),注意学习过程中也必须用到 inference.
类似于 minimize,要编写一个 gradFunc,编号以后第 2,3 步貌似是 problem-independent 的。
mkPotentials 只能针对 +1/-1
potential = exp{w^T \phi}


gradFunc 里面也有用到第三个步骤,并且计算 expected feature 是需要
nodeBel 和 edgeBel
 [nodeBel, MAPlabels, niter, edgeBel, logZ(s)] = infer(infEng, nodePot, edgePot);




  data.nodeFeatures(d,i,s) %d dimension, i node index, s sample
  data.edgeFeatures(d,e,s)%e edge index
  data.nodeLabels(r,c,s) : deduce size of image from this. its value is
                           irrelevant in inference


i 的顺序:column major
e 的顺序:按照 assign_edge_nums_lattice 的顺序,注意 edge 是 directed 的,分 outward, inward, edgeEndsRC(e,:) 给出了第 e-th edge 的起始和结束位置,是最直观的
function [out_edge, outNbr, edgeEndsIJ, edgeEndsRC, in_edge, nedges] = ...
    assign_edge_nums_lattice(nrows, ncols)

%   To assign edge numbers:
%   we loop through the nodes in COLUMN major (Matlab-style) order
%       At each node, we then assign in the order:
%           Left(West), Above(North), Below(Souht), Right(East)
%
%   This ordering is done to be compatible with
%   StarEdge_MakeEdgeNums_Lattice2.m
%   (orders edges by increasing fromNode, then increasing toNode)
%
% out_edge(r,c,dir) = number of edge going OUT of rc in direction dir
% outNbr(r,c,dir,:) = [r' c'] if we follow an edge in direction dir from rc we land in r'c'
% edgeEndsIJ(e,:) = [i j] means we follow e from i to j
% edgeEndsRC(e,:) = [r1 c2 r2 c2] means we follow e from r1c1 to r2c2
% in_edge(r,c,dir)

更进一步说,参照 mkNodeFeatures, mkEdgeFeatures 来写生成
data.nodeFeatures(d,i,s) %d dimension, i node index, s sample
  data.edgeFeatures(d,e,s)%e edge index
的函数

参见注释版:
multi_elvis.m

initiate weights
node weights 是采用 logistic regression, 需要 log-likelihood 的function value, gradient, Hessian,见 Bishop 书
edge weights 是随机生成的。
二者组合而成整体的 weights

1 comments:

Erkang Cheng said...

可以向你请教下CRF 2D 中关于学习的问题吗?
在学习时, 求导时出现期望,怎么求解期望呢?
你在博客中提及的 在学习中需要用到推理?

我的邮箱是ekyaya@gmail.com