사실 원시적인 xor은 심했쩌
주말에 알아본 xor 문제는 하찮은 거였쩌.
그렇다면 위에거를 연장하여 x1, x2, x3 입력에 xor을 치는 거는 어떠나요.
스케일이 늘었음 2개 은닉층으로 해결하지 못하는 문제로 알아야 하겠쩌.
ai에 응답에서 출력 층은 ReLU에서 시그모이드로 바꺼야 할거 같다고 해요.
원시적으로 생각해보면 이렇게 되는데 이럼 전혀 다른 결과가 나는 거여요. 애당초 학습 루프로 해결하면 원래를 알지 못하기에 .. 직접 건드려서 치는 거여요.
이럼 값이 하나만 올랐음 반응하는 신경망이 되었쩌.

Hello world (one true) • Playground • Svelte
<script>
var x1 = $state(0)
var x2 = $state(0)
var x3 = $state(0)
// 은닉층 가중치/편향 (노드 3개)
var w11 = $state(0), w12 = $state(0), w13 = $state(0), b1 = $state(0)
var w21 = $state(0), w22 = $state(0), w23 = $state(0), b2 = $state(0)
var w31 = $state(0), w32 = $state(0), w33 = $state(0), b3 = $state(0)
// 출력층 가중치/편향
var v1 = $state(0), v2 = $state(0), v3 = $state(0), b4 = $state(0)
// 은닉/출력 노드
var h1 = $state(0), h2 = $state(0), h3 = $state(0), r1 = $state(0)
function relu(x) {
return Math.max(0, x);
}
function sigmoid(x) {
return 1 / (1 + Math.exp(-x));
}
$effect(() => {
h1 = relu(w11 * x1 + w12 * x2 + w13 * x3 + b1)
h2 = relu(w21 * x1 + w22 * x2 + w23 * x3 + b2)
h3 = relu(w31 * x1 + w32 * x2 + w33 * x3 + b3)
r1 = relu(v1 * h1 + v2 * h2 + v3 * h3 + b4) // 출력은 sigmoid로 스케일링
})
function resetAll() {
x1 = 0; x2 = 0; x3 = 0;
w11 = 0; w12 = 0; w13 = 0; b1 = 0;
w21 = 0; w22 = 0; w23 = 0; b2 = 0;
w31 = 0; w32 = 0; w33 = 0; b3 = 0;
v1 = 0; v2 = 0; v3 = 0; b4 = 0;
}
</script>
<table>
<tbody>
<!-- 입력값 선택 -->
<tr>
<td>입력</td>
<td colspan="3">
<label><input type="radio" name="inputs" on:change={() => { x1=0;x2=0;x3=0; }} checked /> (0,0,0)</label>
<label><input type="radio" name="inputs" on:change={() => { x1=0;x2=0;x3=1; }} /> (0,0,1)</label>
<label><input type="radio" name="inputs" on:change={() => { x1=0;x2=1;x3=0; }} /> (0,1,0)</label>
<label><input type="radio" name="inputs" on:change={() => { x1=0;x2=1;x3=1; }} /> (0,1,1)</label>
<label><input type="radio" name="inputs" on:change={() => { x1=1;x2=0;x3=0; }} /> (1,0,0)</label>
<label><input type="radio" name="inputs" on:change={() => { x1=1;x2=0;x3=1; }} /> (1,0,1)</label>
<label><input type="radio" name="inputs" on:change={() => { x1=1;x2=1;x3=0; }} /> (1,1,0)</label>
<label><input type="radio" name="inputs" on:change={() => { x1=1;x2=1;x3=1; }} /> (1,1,1)</label>
</td>
</tr>
<tr>
<td colspan="4">x1, x2, x3 = {x1}, {x2}, {x3}</td>
</tr>
<!-- 은닉 노드 1 -->
<tr>
<td><span class="output">h1 = {h1.toFixed(3)}</span></td>
<td><input type="range" bind:value={w11} min="-9" max="9" step="1" /><span>w11: {w11}</span></td>
<td><input type="range" bind:value={w12} min="-9" max="9" step="1" /><span>w12: {w12}</span></td>
<td><input type="range" bind:value={w13} min="-9" max="9" step="1" /><span>w13: {w13}</span></td>
<td><input type="range" bind:value={b1} min="-9" max="9" step="1" /><span>b1: {b1}</span></td>
</tr>
<!-- 은닉 노드 2 -->
<tr>
<td><span class="output">h2 = {h2.toFixed(3)}</span></td>
<td><input type="range" bind:value={w21} min="-9" max="9" step="1" /><span>w21: {w21}</span></td>
<td><input type="range" bind:value={w22} min="-9" max="9" step="1" /><span>w22: {w22}</span></td>
<td><input type="range" bind:value={w23} min="-9" max="9" step="1" /><span>w23: {w23}</span></td>
<td><input type="range" bind:value={b2} min="-9" max="9" step="1" /><span>b2: {b2}</span></td>
</tr>
<!-- 은닉 노드 3 -->
<tr>
<td><span class="output">h3 = {h3.toFixed(3)}</span></td>
<td><input type="range" bind:value={w31} min="-9" max="9" step="1" /><span>w31: {w31}</span></td>
<td><input type="range" bind:value={w32} min="-9" max="9" step="1" /><span>w32: {w32}</span></td>
<td><input type="range" bind:value={w33} min="-9" max="9" step="1" /><span>w33: {w33}</span></td>
<td><input type="range" bind:value={b3} min="-9" max="9" step="1" /><span>b3: {b3}</span></td>
</tr>
<!-- 출력 -->
<tr>
<td><span class="output final">r1 = {r1.toFixed(3)}</span></td>
<td><input type="range" bind:value={v1} min="-9" max="9" step="1" /><span>v1: {v1}</span></td>
<td><input type="range" bind:value={v2} min="-9" max="9" step="1" /><span>v2: {v2}</span></td>
<td><input type="range" bind:value={v3} min="-9" max="9" step="1" /><span>v3: {v3}</span></td>
<td><input type="range" bind:value={b4} min="-9" max="9" step="1" /><span>b4: {b4}</span></td>
</tr>
</tbody>
</table>
<div class="controls">
<button on:click={resetAll}>🔄 Reset</button>
</div>
<style>
td:nth-child(1n){min-width:5em}
</style>쩜만 단순하게 생각해보면 이렇게 정답을 구해요. 사용하지 않는 조정값 애가 킹받
토르는 해머가 고정되는 원리는 단순한 거이라고 하였쩌.
하이 파이브 10:33 (미방 의사양반)

앙

-1 0 1 가중치를 3개 정렬하고 레이어 마다 옆으로 하나를 밀어요. (정답)
고대에 2 입력 xor 에서는 -1 1 가중치를 2개 정렬 하였고 레이어가 2개가 다여서 다른 하나만 옆으로 밀었쩌.
이럼 4 입력 xor은 어떻게 되나 몰라요.

Hello world (3 xor) • Playground • Svelte
<script>
var x1 = $state(0)
var x2 = $state(0)
var x3 = $state(0)
// 은닉층 가중치/편향 (노드 3개)
var w11 = $state(0), w12 = $state(0), w13 = $state(0), b1 = $state(0)
var w21 = $state(0), w22 = $state(0), w23 = $state(0), b2 = $state(0)
var w31 = $state(0), w32 = $state(0), w33 = $state(0), b3 = $state(0)
// 출력층 가중치/편향
var v1 = $state(0), v2 = $state(0), v3 = $state(0), b4 = $state(0)
// 은닉/출력 노드
var h1 = $state(0), h2 = $state(0), h3 = $state(0), r1 = $state(0)
function relu(x) {
return Math.max(0, x);
}
function sigmoid(x) {
return 1 / (1 + Math.exp(-x));
}
$effect(() => {
h1 = relu(w11 * x1 + w12 * x2 + w13 * x3 + b1)
h2 = relu(w21 * x1 + w22 * x2 + w23 * x3 + b2)
h3 = relu(w31 * x1 + w32 * x2 + w33 * x3 + b3)
r1 = relu(v1 * h1 + v2 * h2 + v3 * h3 + b4) // 출력은 sigmoid로 스케일링
})
function resetAll() {
x1 = 0; x2 = 0; x3 = 0;
w11 = 0; w12 = 0; w13 = 0; b1 = 0;
w21 = 0; w22 = 0; w23 = 0; b2 = 0;
w31 = 0; w32 = 0; w33 = 0; b3 = 0;
v1 = 0; v2 = 0; v3 = 0; b4 = 0;
}
</script>
<table>
<tbody>
<!-- 입력값 선택 -->
<tr>
<td>입력</td>
<td colspan="3">
<label><input type="radio" name="inputs" on:change={() => { x1=0;x2=0;x3=0; }} checked /> (0,0,0)</label>
<label><input type="radio" name="inputs" on:change={() => { x1=0;x2=0;x3=1; }} /> (0,0,1)</label>
<label><input type="radio" name="inputs" on:change={() => { x1=0;x2=1;x3=0; }} /> (0,1,0)</label>
<label><input type="radio" name="inputs" on:change={() => { x1=0;x2=1;x3=1; }} /> (0,1,1)</label>
<label><input type="radio" name="inputs" on:change={() => { x1=1;x2=0;x3=0; }} /> (1,0,0)</label>
<label><input type="radio" name="inputs" on:change={() => { x1=1;x2=0;x3=1; }} /> (1,0,1)</label>
<label><input type="radio" name="inputs" on:change={() => { x1=1;x2=1;x3=0; }} /> (1,1,0)</label>
<label><input type="radio" name="inputs" on:change={() => { x1=1;x2=1;x3=1; }} /> (1,1,1)</label>
</td>
</tr>
<tr>
<td colspan="4">x1, x2, x3 = {x1}, {x2}, {x3}</td>
</tr>
<!-- 은닉 노드 1 -->
<tr>
<td><span class="output">h1 = {h1.toFixed(3)}</span></td>
<td><input type="range" bind:value={w11} min="-9" max="9" step="1" /><span>w11: {w11}</span></td>
<td><input type="range" bind:value={w12} min="-9" max="9" step="1" /><span>w12: {w12}</span></td>
<td><input type="range" bind:value={w13} min="-9" max="9" step="1" /><span>w13: {w13}</span></td>
<td><input type="range" bind:value={b1} min="-9" max="9" step="1" /><span>b1: {b1}</span></td>
</tr>
<!-- 은닉 노드 2 -->
<tr>
<td><span class="output">h2 = {h2.toFixed(3)}</span></td>
<td><input type="range" bind:value={w21} min="-9" max="9" step="1" /><span>w21: {w21}</span></td>
<td><input type="range" bind:value={w22} min="-9" max="9" step="1" /><span>w22: {w22}</span></td>
<td><input type="range" bind:value={w23} min="-9" max="9" step="1" /><span>w23: {w23}</span></td>
<td><input type="range" bind:value={b2} min="-9" max="9" step="1" /><span>b2: {b2}</span></td>
</tr>
<!-- 은닉 노드 3 -->
<tr>
<td><span class="output">h3 = {h3.toFixed(3)}</span></td>
<td><input type="range" bind:value={w31} min="-9" max="9" step="1" /><span>w31: {w31}</span></td>
<td><input type="range" bind:value={w32} min="-9" max="9" step="1" /><span>w32: {w32}</span></td>
<td><input type="range" bind:value={w33} min="-9" max="9" step="1" /><span>w33: {w33}</span></td>
<td><input type="range" bind:value={b3} min="-9" max="9" step="1" /><span>b3: {b3}</span></td>
</tr>
<!-- 출력 -->
<tr>
<td><span class="output final">r1 = {r1.toFixed(3)}</span></td>
<td><input type="range" bind:value={v1} min="-9" max="9" step="1" /><span>v1: {v1}</span></td>
<td><input type="range" bind:value={v2} min="-9" max="9" step="1" /><span>v2: {v2}</span></td>
<td><input type="range" bind:value={v3} min="-9" max="9" step="1" /><span>v3: {v3}</span></td>
<td><input type="range" bind:value={b4} min="-9" max="9" step="1" /><span>b4: {b4}</span></td>
</tr>
</tbody>
</table>
<div class="controls">
<button on:click={resetAll}>🔄 Reset</button>
</div>
<style>
td:nth-child(1n){min-width:5em}
</style>신기하지 않나요.
개발이 하기가 싫어서 그냥 쉬었쩌 ..
원래 마무리만 치면 끝나는 거인데 사람들은 계속 미루어 두는거 아니나요.
