-
Notifications
You must be signed in to change notification settings - Fork 0
/
gates.c
89 lines (67 loc) · 1.68 KB
/
gates.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include <math.h>
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define model_size (3)
int32_t or_train[][model_size] = {
{0, 0, 0},
{0, 1, 0},
{1, 0, 0},
{1, 1, 1},
};
#define or_train_count (sizeof(or_train) / sizeof(or_train[0]))
float rand_float(void) { return (float)rand() / (float)RAND_MAX; }
float sigmoidf(float x) { return 1.f / (1.f + expf(-x)); }
float forward(int model[model_size - 1], float *w, float bias) {
float ret = bias;
for (size_t i = 0; i < model_size - 1; i++) {
ret += w[i] * model[i];
}
return sigmoidf(ret);
}
float cost(float *w, float bias) {
float ret = 0.0f;
for (size_t i = 0; i < or_train_count; i++) {
float y = forward(or_train[i], w, bias);
float value = or_train[i][2];
float diff = y - value;
ret += diff * diff;
}
return ret / or_train_count;
}
void print(float *w, float bias) {
for (size_t i = 0; i < 2; i++) {
printf("w%lu: %f ", i, w[i]);
}
printf("b: %f, c: %f\n", bias, cost(w, bias));
}
int32_t main() {
srand(time(0));
float bias = rand_float();
float w[2] = {rand_float(), rand_float()};
float eps = 1;
float rate = 1;
for (int i = 0; i < 10000000; i++) {
float initial_cost = cost(w, bias);
float dw[2];
for (size_t i = 0; i < 2; i++) {
w[i] += eps;
dw[i] = (cost(w, bias) - initial_cost) / eps;
w[i] -= eps;
}
float d_bias = (cost(w, bias + eps) - initial_cost) / eps;
for (size_t i = 0; i < 2; i++) {
w[i] -= dw[i] * rate;
}
bias -= rate * d_bias;
}
print(w, bias);
for (size_t i = 0; i < 2; i++) {
for (size_t j = 0; j < 2; j++) {
int foo[] = {i, j};
printf("%zu & %zu = %f\n", i, j, forward(foo, w, bias));
}
}
}