wintertreey 님의 블로그
MLP 구현 2: 신경망 초기화 본문
앞선 포스팅에선 데이터 전처리과정을 공부했다.
그러면 이번엔 초기화 부분을 알아보자.
![](https://blog.kakaocdn.net/dn/7VdY9/btsL25ILaRl/63jVPY13N9INXIR6M4iCM0/img.png)
initialization
이번에 구현할 신경망의 경우, 은닉층을 1개로 할 예정.
입력층의 뉴런수(inputSize), 출력층의 뉴런수(outputSize)의 경우 이미 데이터로 정해져있다.
내가 정해야 할것은 은닉층의 뉴런수(hiddenSize)이고(이건 메인함수에서 설정해줄 예정)
초기화해야할 것은 가중치w 와 바이어스b이다.
void initializeWeights(int inputSize, int hiddenSize, int outputSize) {
w1.resize(inputSize, vector<double>(hiddenSize));
w2.resize(hiddenSize, vector<double>(outputSize));
b1.resize(hiddenSize, 0.0);
b2.resize(outputSize, 0.0);
for (int i = 0; i < inputSize; i++) {
for (int j = 0; j < hiddenSize; j++)
w1[i][j] = ((double)rand() / RAND_MAX) * 0.01;
}
for (int i = 0; i < hiddenSize; i++) {
for (int j = 0; j < outputSize; j++)
w2[i][j] = ((double)rand() / RAND_MAX) * 0.01;
}
}
바이어스를 가중치와 구분해줘야하는 이유
![](https://blog.kakaocdn.net/dn/cf6KB8/btsL3o802Q6/JH91F4WIo7B7SQGEBFyERk/img.png)
바이어스를 따로 선언하지 않고 가중치의 마지막값을 사용해도 되지 않을까? 라는 의문이 들었다.
바이어스b 는 각 층의 모든 뉴런에 각각 하나씩 필요.
만약 구분해주지 않으면 입력값에 의해 영향을 받게되어 독립적으로 작용할 수가 없게 된다. feed forward할때는 문제가없어보일ㅅ수 있지만, 학습과정에서 입력과 무관하게 업데이트가 되어야하기 때문.
가중치는 난수로, 바이어스를 0으로 초기화해주는 이유
가중치(W)는 입력 데이터를 변환하는 비율.
초기 학습 시 모든 가중치를 서로 다르게 시작해야 뉴런들이 다양한 특성을 학습할 수 있다. 그래서 작은 난수로 초기화.
바이어스는 입력데이터와 무관하게 더해지는 상수이기에 초기에는 0이어도 모델 학습에 영향을 주지 않는다.
학습이 진행되며 바이어스도 역전파과정을 통해 업데이트 되며 적잘한 값으로 변경된다.
메인함수에는 다음과 같이 함수를 불러주었다.
int inputSize = x[0].size(); //53
int hiddenSize = 10;
int outputSize = y[0].size(); //1
initializeWeights(inputSize, hiddenSize, outputSize);
'머신러닝과 딥러닝' 카테고리의 다른 글
MLP 구현 3: 학습단계 (0) | 2025.02.02 |
---|---|
MLP 구현 1: 데이터 전처리 (0) | 2025.02.01 |
MLP 개념 (0) | 2025.02.01 |