Rémi Coulom wrote:petero2 wrote:It seems to me that you would get a similar effect if you let your CLOP parameters represent deltas from your current parameter values, and then project the solution vector onto the subspace corresponding to the k smallest eigenvalues of the hessian.
There is no need to do that at all. As I said, CLOP already does it when it is run with "Correlations all". Any linear transformation of the parameter space should not change the behaviour of CLOP.
The eigenvector corresponding to the smallest (most negative) eigenvalue corresponds to the direction in parameter space that has the largest effect on playing strength. The idea was to ignore adjustments in directions that has negligible effect on the playing strength, on the assumption that it is better to stay close to the original values in that case.
Consider the following example, where I tried to tune the four parameters called qV, rV, mV and pV, which represent piece value corrections for queen, rook, bishop/knight and pawn. After about 6000 games, CLOP reported the following parameter estimates and hessian: (using octave syntax)
Code: Select all
# qV rV mV pV
V=[-14 23 26 -2]';
H = [
-1.9209 -2.0485 3.9416 3.8301
-2.0485 -2.7984 4.5237 1.7491
3.9416 4.5237 -8.2445 -5.6973
3.8301 1.7491 -5.6973 -9.4130
];
The eigenvectors and eigenvalues are:
Code: Select all
[v,L]=eig(H)
v =
-0.340050 -0.025676 0.424797 0.838603
-0.303696 -0.510986 0.652862 -0.469502
0.634159 0.457622 0.621699 -0.043763
0.624481 -0.727197 -0.082519 0.272760
L =
Diagonal Matrix
-18.134820 0 0 0
0 -4.463421 0 0
0 0 -0.044604 0
0 0 0 0.266044
The projection onto the subspace spanned by the first k eigenvectors is:
Code: Select all
vk=v(:,1:k); Vk=sum(diag(vk'*V)*vk',1)
In this case it looks like the effect of moving in the direction of the last two eigenvectors is questionable because the noise level is too high. I you believe that the original parameter values are reasonable, it seems more logical to not move in those directions.
Setting k=2 gives:
Code: Select all
k=2; vk=v(:,1:k); Vk=sum(diag(vk'*V)*vk',1)
Vk =
-4.4760 -4.9538 9.1501 6.7027
Although, I admit that I'm not sure if this method actually improves anything, i.e. if it gives usable parameter adjustments with fewer number of played games.