딥러닝 관련해서 질문이 여러개 있습니다

익명 사용자의 이미지

https://www.codeproject.com/Articles/1237026/Simple-MLP-Backpropagation-Artificial-Neural-Netwo
이 내용을 보면서 MLP 역전파 내용을 공부하고있는데 궁금한 부분에 대해서 내용이 없어서 질문글을 올려봅니다

위 코드에서 W, V, c, b 를 트레인 함수에 매개변수로 사용했는데 왜 랜덤을 사용하고 이게 뜻하는 의미가 감이 안잡힙니다.

또, 벡터관련해서 Train 셋에서 훈련함수로 넘겨줄 값을 resize하는 이유와 make_pair 하는 이유를 모르겠습니다.

질문을 정리하자면
1. W,V,c,b의 매개변수가 의미하는 것, main함수 안에서 rand() 를 쓴 이유
2. 신경망을 훈련하기 위한 데이터인 Trainset 벡터에서 pair, resize, make_pair를 사용한 이유

링크로만 걸면 성의 없어 보이니 코드도 올려봅니다.

#include <iostream>
#include <vector>
#include <math.h>
#include <time.h>
 
using namespace std;
 
#define Train_Set_Size 20
#define PI 3.141592653589793238463
#define N 5
#define epsilon 0.05
#define epoch 50000
 
double c[N] = {};
double W[N] = {};
double V[N] = {};
double b = 0;
 
double sigmoid(double x) {
	return (1.0f / (1.0f + std::exp(-x)));
}
 
double f_theta(double x) {
	double result = b;
	for (int i = 0; i < N; i++) {
		result += V[i] * sigmoid(c[i] + W[i] * x);
	}
	return result;
}
 
void train(double x, double y) {
	for (int i = 0; i < N; i++) {
		W[i] = W[i] - epsilon * 2 * (f_theta(x) - y) * V[i] * x * 
               (1 - sigmoid(c[i] + W[i] * x)) * sigmoid(c[i] + W[i] * x);
	}
	for (int i = 0; i < N; i++) {
		V[i] = V[i] - epsilon * 2 * (f_theta(x) - y) * sigmoid(c[i] + W[i] * x);
	}
	b = b - epsilon * 2 * (f_theta(x) - y);
	for (int i = 0; i < N; i++) {
		c[i] = c[i] - epsilon * 2 * (f_theta(x) - y) * V[i] * 
               (1 - sigmoid(c[i] + W[i] * x)) * sigmoid(c[i] + W[i] * x);
	}
}
 
int main() {
	srand(time(NULL));
	for (int i = 0; i < N; i++) {
		W[i] = 2 * rand() / RAND_MAX -1;
		V[i] = 2 * rand() / RAND_MAX -1;
		c[i] = 2 * rand() / RAND_MAX -1;
	}
	vector<pair<double, double>> trainSet;
	trainSet.resize(Train_Set_Size);
 
	for (int i = 0; i < Train_Set_Size; i++) {
		trainSet[i] = make_pair(i * 2 * PI / Train_Set_Size, sin(i * 2 * PI / Train_Set_Size));
	}
 
	for (int j = 0; j < epoch; j++) {
		for (int i = 0; i < Train_Set_Size; i++) {
			train(trainSet[i].first, trainSet[i].second);
		}
		std::cout << j << "\r";
	}
 
	//Plot the results
	vector<float> x;
	vector<float> y1, y2;
 
	for (int i = 0; i < 1000; i++) {
		x.push_back(i * 2 * PI / 1000);
		y1.push_back(sin(i * 2 * PI / 1000));
		y2.push_back(f_theta(i * 2 * PI / 1000));
	}
 
	FILE * gp = _popen("gnuplot", "w");
	fprintf(gp, "set terminal wxt size 600,400 \n");
	fprintf(gp, "set grid \n");
	fprintf(gp, "set title '%s' \n", "f(x) = sin (x)");
	fprintf(gp, "set style line 1 lt 3 pt 7 ps 0.1 lc rgb 'green' lw 1 \n");
	fprintf(gp, "set style line 2 lt 3 pt 7 ps 0.1 lc rgb 'red' lw 1 \n");
	fprintf(gp, "plot '-' w p ls 1, '-' w p ls 2 \n");
 
	//Exact f(x) = sin(x) -> Green Graph
	for (int k = 0; k < x.size(); k++) {
		fprintf(gp, "%f %f \n", x[k], y1[k]);
	}
	fprintf(gp, "e\n");
 
	//Neural Network Approximate f(x) = sin(x) -> Red Graph
	for (int k = 0; k < x.size(); k++) {
		fprintf(gp, "%f %f \n", x[k], y2[k]);
	}
	fprintf(gp, "e\n");
 
	fflush(gp);
 
 
	system("pause");
	_pclose(gp);
	return 0;
}