37 if (num_layers > ML_MAX_LAYERS) num_layers = ML_MAX_LAYERS;
38 net->layer_count = num_layers;
39 net->learning_rate = learning_rate;
41 for (
int i = 0; i < num_layers; i++) {
42 net->layers[i].weights = random_mat4();
43 net->layers[i].bias = random_vec4();
48 Vec4 current_input = input;
50 for (
int i = 0; i < net->layer_count; i++) {
53 layer->input = current_input;
56 Vec4 wx = mat4_mul_vec4(layer->weights, current_input);
60 SimdVec4 s_wx = vec4_load(wx);
61 SimdVec4 s_bias = vec4_load(layer->bias);
62 SimdVec4 s_z = vec4_add(s_wx, s_bias);
64 layer->z = vec4_store(s_z);
67 layer->output = vec4_sigmoid(layer->z);
68 current_input = layer->output;
81 SimdVec4 s_target = vec4_load(target);
82 SimdVec4 s_output = vec4_load(prediction);
83 SimdVec4 s_error = vec4_sub(s_output, s_target);
85 float mse = vec4_length_sq(s_error) * 0.5f;
92 Vec4 current_delta_vec = vec4_store(s_error);
94 for (
int i = net->layer_count - 1; i >= 0; i--) {
98 Vec4 d_act = vec4_sigmoid_derivative(layer->output);
99 SimdVec4 s_d_act = vec4_load(d_act);
100 SimdVec4 s_curr_delta = vec4_load(current_delta_vec);
103 SimdVec4 s_delta = vec4_scale(s_curr_delta, s_d_act);
104 Vec4 delta = vec4_store(s_delta);
123 SimdVec4 s_delta_simd = vec4_load(delta);
125 dW.cols[0] = vec4_mul(s_delta_simd, layer->input.
x).v;
126 dW.cols[1] = vec4_mul(s_delta_simd, layer->input.
y).v;
127 dW.cols[2] = vec4_mul(s_delta_simd, layer->input.
z).v;
128 dW.cols[3] = vec4_mul(s_delta_simd, layer->input.
w).v;
131 layer->d_weights = dW;
132 layer->d_bias = delta;
137 Mat4 W_T = mat4_transpose(layer->weights);
140 current_delta_vec = mat4_mul_vec4(W_T, delta);
145 Mat4 step_W = mat4_scalar_mul(dW, net->learning_rate);
146 layer->weights = mat4_sub(layer->weights, step_W);
149 SimdVec4 s_db = vec4_load(delta);
150 SimdVec4 s_step_b = vec4_mul(s_db, net->learning_rate);
151 SimdVec4 s_new_b = vec4_sub(vec4_load(layer->bias), s_step_b);
152 layer->bias = vec4_store(s_new_b);
float ml_train_step(ML_Network *net, Vec4 input, Vec4 target)
Train the network on a single sample.
void ml_init(ML_Network *net, int num_layers, float learning_rate)
Initialize a new network.