기계 학습 골프 : 곱셈


68

이 커뮤니티에 다른 종류의 골프 도전을 제안하고 싶습니다.

(인공) 신경망 은 (일반적으로 알려지지 않은) 기능을 근사하도록 설계되고 훈련 될 수있는 매우 인기있는 기계 학습 모델입니다. 그들은 종종 신경 네트워크에 프라이머를 들어 ... 우리는 음성 인식, 이미지 분류의 특정 종류, 자율 주행 시스템의 다양한 작업, 같은 알고리즘 해결하는 방법을 모르는 매우 복잡한 문제를 해결하는 데 사용하고 이 우수 고려 위키피디아 기사 .

이것이 일련의 기계 학습 골프 도전이되기를 희망하는 첫 번째이므로 가능한 한 간단하게 유지하고 싶습니다.

당신의 선택, 디자인의 언어와 프레임 워크에서 주어진, 신경망 훈련 (x1,x2) 자신의 제품 계산 x1x2 모든 정수에 대한 x1,x2 사이 (포함) 1010 .

성과 목표

자격을 갖추기 위해 모델이 해당 항목의 올바른 결과에서 0.5 이상 벗어나지 않아야 합니다.

규칙

당신의 모델

  • '전통적인'신경망이어야합니다 (노드의 값은 이전 레이어의 일부 노드에 대한 가중 선형 조합으로 계산 된 다음 활성화 기능이 있어야 함).
  • 다음 표준 활성화 기능 만 사용할 수 있습니다.
    1. linear(x)=x ,
    2. softmax(x)i=exijexj ,
    3. seluα,β(x)={βx, if x>0αβ(ex1), otherwise ,
    4. softplus(x)=ln(ex+1) ,
    5. leaky-reluα(x)={x, if x<0αx, otherwise ,
    6. tanh(x) ,
    7. sigmoid(x)=exex+1 ,
    8. hard-sigmoid(x)={0, if x<2.51, if x>2.50.2x+0.5, otherwise ,
    9. ex
  • 취해야 (x1,x2) 중 어느 하나 tupel / 벡터 /리스트 AS / ... 정수 또는 유일한 입력으로 수레
  • 응답을 정수, float (또는이 응답을 포함하는 적절한 컨테이너 (예 : 벡터 또는 목록))로 반환하십시오.

답은 모델의 훈련 된 가중치를 포함하여 결과를 확인하는 데 필요한 모든 코드를 포함하거나 링크해야합니다.

채점

가중치가장 적은 신경망 (바이어스 가중치 포함)이 이깁니다.

즐겨!


9
사이트에 오신 것을 환영합니다! 나는이 도전이 신경망의보다 강력한 정의로부터 많은 혜택을 얻을 수 있다고 생각한다. 여기에 몇 가지가 있습니다. 1) 이미 NN에 대한 지식을 암시하지 않는 언어로 명시하는 것이 좋습니다. 2) 외부 소스에 연결하지 않고 게시물에 활성화 기능을 나열해야합니다 ( 외부 링크는 변경되거나 사라질 수 있습니다).
밀 마법사

4
가중치를 재사용하거나 컨볼 루션 레이어를 사용할 수 있습니까? (이 보너스는 도전에 아무 것도 추가하지 않고 주요 목표를 산만하게하기 때문에 보너스를 제거하는 것이 좋습니다.) 가중치는 실제 값이거나 복잡 할 수 있습니까?
flawr

4
당신의 말은 레이어 3의 노드가 레이어 1의 입력을 사용할 수 없다는 것을 의미합니다. 레이어 2 노드가 단순히 f(x) = x입력을 전달 하기 위해 가중치가 있습니까?
그리미

4
오른쪽 열에는 샌드 박스 링크가 있어야합니다.이 링크는 질문이 기본 사이트에 게시되기 전에 이러한 종류의 문제를 해결하기 위해 명시 적으로 작성되었습니다. 그리고 네트워크 철학은 질문이 해결 된 후 이해가되지 않거나 질문에 대한 변경 사항을 엄격하게 제한하는 많은 답변을 얻는 것보다 질문을 닫고 수정하고 다시 여는 것이 낫다는 것입니다. .
피터 테일러

7
전혀. 이러한 종류의 문제는 다른 사람들이 같은 종류의 실수를 저지르는 모습을 수년 간 경험 한 결과 발견됩니다. 일부 모호한 부분이 샌드 박스를 지나서 미끄러지지 만 더 많은 부분이 발견됩니다. 내 첫 번째 의견에서 알 수 있듯이 우리는 두 달 전에 신경망 문제정확히 같은 문제 가 있었기 때문에 이것은 분명히 잡혔을 것 입니다.
피터 테일러

답변:


37

21 13 11 9 무게

이것은 1 차원의 실례에서 다항식의 정체성으로 감소하는 이중 선형편광 정체성을 바탕으로한다 .

xy=(x+y)2(xy)24

따라서 선형 변환을 사용하여 y1계산 하고 다음 단계의 전처리 단계로서의 절대 값입니다 . "하드"부분은 아래에서 설명 할 사각형을 계산 한 후 그 차이와 스케일링을 계산합니다. 다시 선형 연산입니다.[x+y, x-y]y3y1

s{0,1,2,,20}0.5

approx_square(x)=i=02wiexp(0.0001ix)

W2=(wi)i0.02

function p = net(x)
% 9 weights
one = 1; 
mone =-1;
zero = 0;
fourth = 0.25;
W1 = [1e-4, 2e-4];
W2  = [-199400468.100687;99700353.6313757];
b2 = 99700114.4299316;
leaky_relu = @(a,x)max(a*x,x); 


% Linear
y0 = [one, one; one, mone] * x;

% Linear + ReLU
y1 = mone * y0;
y2 = [leaky_relu(zero, y0), leaky_relu(zero, y1)];

% Linear
y3 = y2 * [one; one];

% Linear + exp
y4 = exp(y3 * W1); 

% Linear + Bias
y5 =  y4 * W2 + b2;

% Linear
y6 = [one, mone]*y5;
p = y6 * fourth;

end

온라인으로 사용해보십시오!


TIO 링크 바닥 글의 확인 코드에의 응용 프로그램이 누락 된 것 같습니다 abs. 그러나 어쨌든 모든 것이 괜찮습니다.
Christian Sievers

@ChristianSievers 감사합니다. TIO 링크를 업데이트했습니다!
flawr

나는 호기심으로 NN의 전문가가 아닙니다. 무게 카운트는 어떻게 이루어 집니까? y04 필요 y1둘 필요가있다, y3이 필요 y4하나 필요 y5하나 필요하고 y612의 2를 필요가 있겠습니까?
마가렛 블룸

3
@MargaretBloom 그렇습니다. 이것은 실제로 조금 드문 일이지만 OP는 의견에서 무게를 재사용 할 수 있으며 같은 무게를 여러 번 사용하더라도 무게를 한 번만 계산하면된다고 말했습니다. 그래서 내가 사용하는 모든 가중치는 함수의 첫 부분에서 정의됩니다.
flawr

31

7 개의 무게

eps = 1e-6
c = 1 / (2 * eps * eps)

def f(A, B):
	e_s = exp(eps * A + eps * B)  # 2 weights, exp activation
	e_d = exp(eps * A - eps * B)  # 2 weights, exp activation
	return c * e_s + (-c) * e_d + (-1 / eps) * B  # 3 weights, linear activation

온라인으로 사용해보십시오!

작은 대해 다음과 같은 근사값을 사용합니다.ϵex1+x+x22

ABeϵA+ϵBeϵAϵB2ϵ2Bϵ

ϵepsc


1
이것이 '전통적인 신경망'(규칙 # 1)으로 간주되는지 확실하지 않지만 하나로 다시 포맷 할 수 있다는 것은 분명합니다. 그래서 문제가 없습니다. 좋은 해결책!
Stefan Mesken

1
하나의 무게를 절약하기 위해 C = -B(1 무게)를 정의한 다음 [e_s, e_d] = conv([A,B,C], [eps, eps])(2 무게)를 가질 수 있습니다 : (BTW : 매우 영리한 접근법!)
flawr

(나는을 추가하는 것을 잊었다 exp)
flawr

4
무게재사용하면 훨씬 더 낮아질 수 있습니다 . 같은 무게를 여러 번 세지 않아도됩니다.
flawr

2
@flawr 그것은 좋은 속임수이지만, 의견에 컨볼 루션과 가중치를 재사용하는 것은 이것이 너무 다른 도전으로 만들어서이 답변을 그대로 유지할 것이라고 생각합니다.
xnor

22

33 31 무게

# Activation functions
sub hard { $_[0] < -2.5 ? 0 : $_[0] > 2.5 ? 1 : 0.2 * $_[0] + 0.5 }
sub linear { $_[0] }

# Layer 0
sub inputA() { $a }
sub inputB() { $b }

# Layer 1
sub a15() { hard(5*inputA) }

# Layer 2
sub a8()  { hard(-5*inputA + 75*a15 - 37.5) }

# Layer 3
sub aa()  { linear(-5*inputA + 75*a15 - 40*a8) }

# Layer 4
sub a4()  { hard(aa - 17.5) }

# Layer 5
sub a2()  { hard(aa - 20*a4 - 7.5) }

# Layer 6
sub a1()  { linear(0.2*aa - 4*a4 - 2*a2) }

# Layer 7
sub b15() { hard(0.25*inputB - 5*a15) }
sub b8()  { hard(0.25*inputB - 5*a8) }
sub b4()  { hard(0.25*inputB - 5*a4) }
sub b2()  { hard(0.25*inputB - 5*a2) }
sub b1()  { hard(0.25*inputB - 5*a1) }

# Layer 8
sub output() { linear(-300*b15 + 160*b8 + 80*b4 + 40*b2 + 20*b1 - 10*inputA) }

# Test
for $a (-10..10) {
        for $b (-10..10) {
                die if abs($a * $b - output) >= 0.5;
        }
}

print "All OK";

온라인으로 사용해보십시오!

이것은 (Sorta) 이진수로 긴 곱셈을 수행하므로 정확한 결과를 반환합니다. 0.5 오류 창을 활용하여이를 더 골프화하는 것이 가능해야하지만 어떻게 해야할지 모르겠습니다.

레이어 1 ~ 6은 첫 번째 입력을 5 "비트"로 분해합니다. 골프를 위해 실제 바이너리를 사용하지 않습니다. 가장 중요한 "비트"의 가중치는 16이 아닌 -15이며 입력이 0 일 때 모든 "비트"는 0.5입니다 (동일성을 유지하므로 여전히 잘 작동합니다 inputA = -15*a15 + 8*a8 + 4*a4 + 2*a2 + 1*a1).


1
나는 누군가가 하드 코딩 된 ANN 인증 곱셈 알고리즘을 생각해 내기를 기대했다. 그러나 나는 그것이 첫 번째 응답이라고 생각하지 않았습니다. 잘 했어! (또한 MNIST 데이터 세트를 사용하여 이와 같은 것을 제거 할 수 있는지 또는 다른
상대적인

14

43 개의 무게

지금까지 게시 된 두 가지 솔루션은 매우 영리했지만 머신 러닝 (OCR과 같은)의 전통적인 작업에는 그 방법이 효과가 없을 것입니다. 따라서 나는 다른 사람들이 그것을 향상시키고 기계 학습의 세계에 빠져들기를 희망적으로 고무시키는이 작업에 '일반적인'(영리한 트릭 없음) 솔루션을 제출하고 싶습니다.

내 모델은 TensorFlow 2.0에 내장 된 2 개의 숨겨진 레이어가있는 매우 간단한 신경망입니다 (그러나 다른 프레임 워크도 작동합니다).

model = tf.keras.models.Sequential([
tf.keras.layers.Dense(6, activation='tanh', input_shape=(2,)),
tf.keras.layers.Dense(3, activation='tanh'),
tf.keras.layers.Dense(1, activation='linear')
])

보시다시피, 모든 레이어는 밀도가 높으며 (가장 최적의 것은 아님), 활성화 기능은이 작업의 특성상 선형 활성화 기능이 있습니다.

43 개의 가중치가 있습니다 :

  • (2+1)6=18
  • (6+1)3=21
  • (3+1)1=4

1010

다음으로 정수 곱셈 작업의 최대 편차를 최적화하여 미세 조정했습니다. 불행히도, 내 노트는 내가 끝내었던 미세 조정을 많이 나타내지 않지만 매우 작습니다. 441 개의 훈련 샘플에서 100 개의 신기원 근처에 배치 크기는 441입니다.

이것으로 내가 끝낸 무게는 다음과 같습니다.

[<tf.Variable 'dense/kernel:0' shape=(2, 6) dtype=float32, numpy=
 array([[ 0.10697944,  0.05394982,  0.05479664, -0.04538541,  0.05369904,
         -0.0728976 ],
        [ 0.10571832,  0.05576797, -0.04670485, -0.04466859, -0.05855528,
         -0.07390639]], dtype=float32)>,
 <tf.Variable 'dense/bias:0' shape=(6,) dtype=float32, numpy=
 array([-3.4242163, -0.8875816, -1.7694025, -1.9409281,  1.7825342,
         1.1364107], dtype=float32)>,
 <tf.Variable 'dense_1/kernel:0' shape=(6, 3) dtype=float32, numpy=
 array([[-3.0665843 ,  0.64912266,  3.7107112 ],
        [ 0.4914808 ,  2.1569328 ,  0.65417236],
        [ 3.461693  ,  1.2072319 , -4.181983  ],
        [-2.8746269 , -4.9959164 ,  4.505049  ],
        [-2.920127  , -0.0665407 ,  4.1409926 ],
        [ 1.3777553 , -3.3750365 , -0.10507642]], dtype=float32)>,
 <tf.Variable 'dense_1/bias:0' shape=(3,) dtype=float32, numpy=array([-1.376577  ,  2.8885336 ,  0.19852689], dtype=float32)>,
 <tf.Variable 'dense_2/kernel:0' shape=(3, 1) dtype=float32, numpy=
 array([[-78.7569  ],
        [-23.602606],
        [ 84.29587 ]], dtype=float32)>,
 <tf.Variable 'dense_2/bias:0' shape=(1,) dtype=float32, numpy=array([8.521169], dtype=float32)>]

0.44350433910=90.443504

내 모델은 여기 에서 찾을 수 있으며 온라인 에서도 사용해 볼 수 있습니다! Google Colab 환경에서


6

2 개의 무게

ϵ>0

xyeϵx+ϵy+eϵxϵyeϵxϵyeϵx+ϵy4ϵ2.

ϵ=0.01

{±ϵ,±(4ϵ2)1}{±ϵ,(4ϵ3)1}±(4ϵ2)1=±ϵ(4ϵ3)1. 위의 의견에서 언급했듯이 기계 정밀도의 가중치를 가진 모든 신경망은 두 개의 다른 가중치로 (거대한!) 신경망으로 골프를 칠 수 있습니다. 이 절차를 적용하여 다음 MATLAB 코드를 작성했습니다.

function z=approxmultgolfed(x,y)

w1 = 0.1;   % first weight
w2 = -w1;   % second weight

k  = 250000;
v1 = w1*ones(k,1);
v2 = w2*ones(k,1);

L1 = w1*eye(2);
L2 = [ w1 w1; w2 w2; w1 w2; w2 w1 ];
L3 = [ v1 v1 v2 v2 ];
L4 = v1';

z = L4 * L3 * exp( L2 * L1 * [ x; y ] );

{±0.1}

단 1 개의 무게로 도망 치는 법 (!)

{±0.1}0.10.1

0.1x=wwx,

w100.110.5

{±10k}10k

(아마도 미래의 신경망 골프 도전에서 재사용 된 웨이트가 어떻게 점수를 매기는지를 수정해야 할 것입니다.)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.