pinv (H) не равно pinv (H '* H) * H' - PullRequest
       0

pinv (H) не равно pinv (H '* H) * H'

0 голосов
/ 14 февраля 2019

Я тестирую функцию y = SinC(x) с прямыми нейронными сетями прямого доступа (SLFN) с одним скрытым слоем и 20 нейронами.

С SLFN в выходном слое можно описать выходной вес (OW)на

OW = pinv(H)*T

после добавления регуляризованного параметра gamma, который

OW = pinv(I/gamma+H'*H)*H'*T 

с

gamma -> Inf, pinv(H'*H)*H'*T == pinv(H)*T, also pinv(H'*H)*H' == pinv(H).

Но когда я пытаюсь вычислить pinv(H'*H)*H' и pinv(H), Я нахожу огромную разницу между этими двумя, когда число нейронов больше 5 (меньше 5, они равны или почти одинаковы).

Например, когда H - это матрица 10*10, cond(H) = 21137561386980.3, rank(H) = 10,

H = [0.736251410036783  0.499731137079796   0.450233920602169   0.296610970576716   0.369359425954153   0.505556211442208   0.502934880027889   0.364904559142718   0.253349959726753   0.298697900877265;
0.724064281864009   0.521667364351399   0.435944895257239   0.337878535128756   0.364906002569385   0.496504064726699   0.492798607017131   0.390656915261343   0.289981152837390   0.307212326718916;
0.711534656474153   0.543520341487420   0.421761457948049   0.381771374416867   0.360475582262355   0.487454209236671   0.482668250979627   0.417033287703137   0.329570921359082   0.315860145366824;
0.698672860220896   0.565207057974387   0.407705930918082   0.427683127210120   0.356068794706095   0.478412571446765   0.472552121296395   0.443893207685379   0.371735862991355   0.324637323886021;
0.685491077062637   0.586647027111176   0.393799811411985   0.474875155650945   0.351686254239637   0.469385056318048   0.462458480695760   0.471085139463084   0.415948455902421   0.333539494486324;
0.672003357663056   0.607763454504209   0.380063647372632   0.522520267708374   0.347328559602877   0.460377531907542   0.452395518357816   0.498449772544129   0.461556360076788   0.342561958147251;
0.658225608290477   0.628484290731116   0.366516925684188   0.569759064961507   0.342996293691614   0.451395814182317   0.442371323528726   0.525823695636816   0.507817005881821   0.351699689941632;
0.644175558300583   0.648743139215935   0.353177974096445   0.615761051907079   0.338690023332811   0.442445652121229   0.432393859824045   0.553043275759248   0.553944175102542   0.360947346089454;
0.629872705346690   0.668479997764613   0.340063877672496   0.659781468051379   0.334410299080102   0.433532713184646   0.422470940392161   0.579948548513999   0.599160649563718   0.370299272759337;
0.615338237874436   0.687641820315375   0.327190410302607   0.701205860709835   0.330157655029498   0.424662569229062   0.412610204098877   0.606386924575225   0.642749594844498   0.379749516620049];

T=[-0.806458764562879 -0.251682808380338 -0.834815868451399 -0.750626822371170 0.877733363571576 1 -0.626938984683970 -0.767558933097629 -0.921811074815239 -1]';

Существует огромная разница между pinv(H'*H)*H*T и pinv(H)*T,где

pinv(H'*H)*H*T = [-4803.39093243484   3567.08623820149    668.037919243849  5975.10699147077  
                   1709.31211566970  -1328.53407325092  -1844.57938928594 -22511.9388736373  
                  -2377.63048959478  31688.5125271114]';

pinv(H)*T = [-19780274164.6438 -3619388884.32672 -76363206688.3469 16455234.9229156
             -135982025652.153 -93890161354.8417 283696409214.039 193801203.735488
             -18829106.6110445 19064848675.0189]'.

Я также обнаружил, что если я округлю H, round(H,2), pinv(H'*H)*H*T и pinv(H)*T, вернем один и тот же ответ.Поэтому я думаю, что одной из причин может быть проблема вычисления числа с плавающей точкой внутри matlab.

Но так как cond(H) большое, любое небольшое изменение H может привести к большой разнице в обратном значении H,Я думаю, что функция round не может быть хорошим вариантом для тестирования.Как отметил Крис Луенго, при больших cond числовая неточность будет влиять на точность инверсии.

В своем тесте я использую 1000 обучающих выборок Input:[-10,10], с шумом между [-0.2,0.2], а тестовые образцы не содержат шума.20 нейронов выбраны.OW = pinv(H)*T может дать разумные результаты для SinC тренировки, в то время как производительность для OW = pinv(H'*H)*T хуже.Затем я пытаюсь увеличить точность H'*H на pinv(vpa(H'*H)), никаких существенных улучшений нет.

Кто-нибудь знает, как решить эту проблему?

1 Ответ

0 голосов
/ 04 марта 2019

После некоторых исследований ответ таков: ELM очень чувствителен к функции масштабирования и активации.

Пожалуйста, обратитесь к этому документу за подробностями: https://dl.acm.org/citation.cfm?id=2797143.2797161

И документ: https://ieeexplore.ieee.org/document/8533625 продемонстрировал новый алгоритм для улучшения производительности ELM для масштабирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...