목록전체 글 (363)
지노랩 /JinoLab
1. 미분이 뭐예요?함수 f(x)의 미분은 “함수 값이 얼마나 빨리 변하는지”를 나타내는 수학적 도구예요.기하학적으로는 접선의 기울기를 뜻해요.즉, x를 아주 조금 Δx 만큼 바꿨을 때, f가 얼마나 변하는지( Δf )를 Δx로 나누면, 그 비율이 미분값이에요.2. 주요 미분 공식상수배 법칙상수 cc는 그대로 밖으로 나온다!거듭제곱 법칙 (Power Rule)합의 법칙차의 법칙 (합과 같음)곱의 법칙 (Product Rule)체인 룰 (Chain Rule)3. 접선 기울기 계산 예시예: f(x) = 3x 일 때, x=2에서 기울기는 항상 3! (직선이라 일정)예: g(x) = x^2 일 때, g′(x) = 2x 이므로, x = 3에서 기울기는 2⋅3 = 6 4. C 언어로 “수치 미분(Numerical ..
데이터 정규화가중치 초기화(예시로 임의값 사용)첫 번째 학습 예제 순전파중간값(z), 활성화(a), 출력(ŷ) 계산1. 문제 정의입력 (x1,x2) = (운동시간, 휴식시간)출력 y = 근육량 증가(grams)신경망 구조입력층: 2개 노드은닉층: 3개 노드 (활성화: ReLU)출력층: 1개 노드 (활성화: Sigmoid)2. 코드 전체#include #include // --- 활성화 함수들 ---double relu(double z) { return z > 0 ? z : 0;}double sigmoid(double z) { return 1.0 / (1.0 + exp(-z));}// --- 순전파 함수 ---// X: (m×n) 입력 행렬, W1: (n×h) 은닉 가중치, W2: (h×1) 출..
1. 활성화 함수가 왜 필요할까?선형 함수의 한계입력값 xx와 가중치 ww를 곱하고 더하면 언제나 “직선” 모양의 결과만 나와요.예를 들어, y=2x, y=x+3 이런 식만 표현할 수 있죠.비선형 패턴 학습현실 세계의 데이터(이미지, 음성, 글자 등)는 아주 복잡해요.“직선”만으로는 사람 얼굴의 곡선, 음성의 억양 같은 복잡한 패턴을 배우기 어려워요.그래서 **활성화 함수(Activation Function)**로 입력을 곡선 형태로 변환해야, 여러 층(layer)을 쌓았을 때 다양한 곡선 모양을 만들 수 있어요.역전파(Backpropagation)를 위한 미분 가능성학습 과정에서 “실제값과 예측값의 차이”를 줄이려고 가중치 ww를 업데이트할 때, 미분(derivative)이 필요해요...
은닉층·출력층 가중치 행렬을 0~1 사이의 난수로 초기화random_init(rows, cols, W) 함수를 통해 임의의 실수를 생성해 W[i][j]에 저장RAND_MAX를 이용해 rand()/(double)RAND_MAX 형태로 0~1 구간 난수 생성srand(time(NULL))으로 시드 초기화#include #include #include /** * @brief rows×cols 크기의 행렬 W 를 0~1 난수로 채웁니다. * @param rows 행(첫 차원) 크기 * @param cols 열(둘째 차원) 크기 * @param W 결과를 저장할 2D 배열 (row-major) */void random_init(int rows, int cols, double W[rows][cols]) ..
각 벡터의 최댓값을 찾아해당 최댓값으로 모든 원소를 나누어[0,1] 구간으로 스케일링 합니다.#include /** * @brief 1차원 배열에서 최댓값을 찾습니다. * @param arr 입력 배열 * @param n 배열 길이 * @return 최댓값 */double max_in_array(const double *arr, int n) { double m = arr[0]; for (int i = 1; i m) { m = arr[i]; } } return m;}/** * @brief 배열을 [0,1] 구간으로 정규화합니다. * 각 원소를 최댓값으로 나눈 결과를 out[]에 저장. * @param in 입력 배..
아래는 “헬스장 데이터”(운동 시간·휴식 시간 → 근육량 증가) 예제를 C 언어로 구현한 앞으로 전파(Forward Propagation) 코드입니다.데이터 전처리: 원본 데이터를 최대값으로 나눠 [0,1] 구간으로 정규화네트워크 구조:입력층: 2개 특성(운동 시간, 휴식 시간)은닉층: 3개 유닛 (ReLU 활성화)출력층: 1개 유닛 (항등 활성화)#include // --- 활성화 함수들 ---double relu(double x) { return x > 0 ? x : 0;}// --- 행렬·벡터 곱: z = X (m×n) · W (n×p) -->// result is Z (m×p)void matmul(const double *X, int m, int n, const do..
1. 입력과 가중치생물학적 뉴런: 수많은 다른 뉴런의 신호가 가지돌기(수상돌기)를 통해 들어오며, 각 연결부위(시냅스)의 “강도(가중)”에 따라 영향력이 달라짐인공 뉴런: 입력 벡터 x=[x1,x2,…,xn]와 대응하는 가중치 벡터 w=[w1,w2,…,wn]를 가짐비유: wi는 생물학적 시냅스 강도에 해당2. 합산 (Summation)생물학적 뉴런: 세포체에서 모든 시냅스 후 전위가 합쳐져 막 전위가 결정됨인공 뉴런:로, 입력값과 가중치를 곱한 뒤 모두 더해 단일 스칼라 값 zz를 얻음3. 활성화 함수 (Activation)생물학적 뉴런: 막 전위가 임계치(threshold)를 넘으면 일종의 ‘발화(spike)’ 신호를 축삭(axon)을 통해 멀리 전달인공 뉴런: z에 비선형 함수를 적용하여 출력값을 계..
1. 경사하강법이란?목표: 손실함수(loss function) E(w) 를 최소화하는 가중치 w* 를 찾는 방법손실함수 예시:경사(gradient):업데이트 룰:α: 학습률(learning rate)매 단계마다 dE/dw의 “방향”과 “크기”를 참고해 w를 조금씩 내려가면(하강하면), 손실이 점차 줄어듭니다.2. 시각적 이해 E(w) ▲ │ ● │ / \ │ / \ │ / \ │ ● ● ← 목표점(기울기=0, 최소 손실) │ / \ │ / \ │ ● ● └──────────────────▶ w ..
아래는 “브루트 포스 학습(Brute‑Force Learning)”이라 부르는, 가중치를 한 스텝씩 올려보거나 내려보면서 오차가 줄어드는 방향으로 학습하는 단일 퍼셉트론 C 예제입니다. 이해를 돕기 위해 상세 주석과 함께, 반복(iterations)마다 가중치·예측값·오차가 어떻게 변하는지 출력합니다.#include #include /** * @brief 제곱 오차 계산: (y_pred - y_true)^2 */double squared_error(double y_pred, double y_true) { double diff = y_pred - y_true; return diff * diff;}/** * @brief 브루트 포스 학습 시뮬레이션 * @param x 입력값 *..
1. 용어 정리xx: 입력 값 (스칼라)w: 현재 가중치y^=x×w 예측값y: 실제값(정답)순수 오차 δ=y^−y부호를 갖는 차이로, “예측이 얼마나, 어느 방향으로 벗어났는지” 알려 줌학습률 α가중치 업데이트 크기를 조절하는 상수 (예: 0.01)델타 가중치 Δw=α δ x업데이트:2. 의사코드(Pseudocode)initialize w randomly or to 0set learning rate α (e.g. 0.01)for each training sample (x, y): y_pred = x * w δ = y_pred - y # 순수 오차 (signed error) Δw = α * δ * x # 델타 룰 w = w..
1. 텐서(Tensor) 기본 개념텐서는 “데이터의 컨테이너”로, 스칼라·벡터·행렬·다차원 배열 등을 통칭합니다.랭크(rank): 텐서의 차원(축, axes) 개수모양(shape): 각 축(차원)별 크기를 나열한 것 타입랭크설명예시 shape스칼라0하나의 숫자[]벡터11차원 배열 (길이 N)[N]행렬22차원 배열 (M×N)[M, N]다차원 텐서≥33D 이미지, 배치 처리용 4D 등[d1, d2, …]2. C 언어 예제아래 코드를 컴파일하고 실행하면, 각 데이터 타입의 값을 화면에 출력하고, 랭크와 모양을 함께 보여줍니다.#include #include /* 0D Tensor (Scalar) */void demo_scalar() { double x = 3.14; // 스칼라: 하나의 숫자 p..
1. 학습 과정의 세 단계예측(Predict)입력값과 현재 가중치를 이용해 모델이 출력을 생성비교(Compare)모델 출력(예측값)과 실제 관측값(정답)을 비교해 오차(error) 를 계산학습(Learn)오차를 줄이도록 가중치를 조정 (경사하강법 등)이번 글에서는 ❷ 비교 단계, 즉 오차 계산에 집중합니다.2. 오차(Error)란?예측값 y^실제값(정답, 레이블) y이 둘의 차이를 오차(error) 라고 부르며, 학습의 핵심은 이 오차를 최소화하는 가중치 w를 찾는 것3. 오차 함수(Loss Function)3.1 제곱 오차(Squared Error)절댓값 대신 제곱을 쓰는 이유부호(양수·음수) 상관없이 오차를 양수로 취급미분 시 연속·매끄러운 함수가 되어, 경사하강법 등 최적화 기법 적용 가능3.2 평..
1. 네트워크 구조입력층 → 은닉층입력 벡터 x∈Rnin가중치 행렬 W(1)∈Rnhid×nin은닉 활성 벡터 h∈Rnhid 은닉층 → 출력층은닉 벡터 h가중치 행렬 W(2)∈Rnout×nhid출력 예측 벡터 y∈Rnout x (n_in) ──▶ W¹ ──▶ h (n_hid) ──▶ W² ──▶ y (n_out)이번 예제에서는 선형 활성화만 사용합니다. (추후 ReLU, Sigmoid 추가 가능)2. C 언어 구현2.1 헤더 파일: simple_mlp.h#ifndef SIMPLE_MLP_H#define SIMPLE_MLP_H/** * @brief 1층 은닉층을 갖는 MLP 예측 함수 (선형 활성화) * @param x 입력 벡터 (크기 n_in) * @param W..
이번 글에서는 다중 입력·다중 출력(Multiple Input, Multiple Output, MIMO) 퍼셉트론을 C 언어로 구현해 보겠습니다. 앞에서 구현한 “다중 입력·단일 출력”을 여러 개의 출력으로 확장한 형태입니다. 컴퓨터공학과 전공생 여러분이 쉽게 따라 할 수 있도록 이론과 코드 예제를 단계별로 설명합니다.1. 네트워크 아키텍처flowchart TB subgraph Features x0[온도 x₀] x1[습도 x₁] x2[공기질 x₂] end subgraph WeightsMatrix [가중치 행렬 W (3×3)] direction TB row0[/w₀₀ w₀₁ w₀₂\] row1[/w₁₀ w..
1. 네트워크 아키텍처입력 벡터: [x₀(온도), x₁(습도), x₂(공기질)]가중치 벡터: [w₀, w₁, w₂ ] ↓ ↓ ↓ x₀·w₀ x₁·w₁ x₂·w₂ ↘ ↓ ↙ ─────────⊕───────── ↓ y_pred = ∑ xᵢ·wᵢ 입력(features): 온도(x₀), 습도(x₁), 공기질(x₂)가중치(weights): 각 특성별 중요도를 나타내는 파라미터 w₀, w₁, w₂출력(prediction): 가..
1. 네트워크 구조flowchart LR Temp[온도 x₀] --> Mult0[× w₀] --> Sum[+] Humi[습도 x₁] --> Mult1[× w₁] --> Sum AQ[공기질 x₂] --> Mult2[× w₂] --> Sum --> y_pred입력:x0x_0: 온도x1x_1: 습도x2x_2: 공기질가중치:w0w_0: 온도 가중치w1w_1: 습도 가중치w2w_2: 공기질 가중치출력 (ypredy_{\text{pred}})는 다음과 같이 계산합니다.ypred=x0w0+x1w1+x2w2 y_{\text{pred}} = x_0 w_0 + x_1 w_1 + x_2 w_2이때 xiwi\displaystyle x_i w_i 각 항은 “단일 입력·단일 출력” 네트워크의 예측값이며, 이들을..
단일 입력·다중 출력 퍼셉트론 구현하기이번 글에서는 하나의 입력값으로 여러 개의 출력값을 동시에 예측하는 신경망 구조를 C 언어로 구현해 보겠습니다. 입력이 스칼라(scalar)인 반면, 가중치와 출력은 1차원 배열(vector)로 다루는 부분에 주목하세요.1. 아키텍처 이해flowchart LR Input[감정 상태: sad] --> Mult0[× w₀] --> Out0[온도 예측 y₀] --> Mult1[× w₁] --> Out1[습도 예측 y₁] --> Mult2[× w₂] --> Out2[공기질 예측 y₂]입력(input): 스칼라 값 sad가중치(weights): 길이 3짜리 배열 {w₀, w₁, w₂}출력(outputs): 길이 3짜리 배열 {y₀, y₁, y..
1. 구조 설명flowchart LR Input[감정 상태: sad] --> Mult0[× w_temp] --> Out0[온도 예측: y₀] Input --> Mult1[× w_humi] --> Out1[습도 예측: y₁] Input --> Mult2[× w_aq] --> Out2[공기질 예측: y₂]입력(Input): 하나의 값(예: 사람의 기분 sad)가중치(Weights):w_temp: 온도 예측용w_humi: 습도 예측용w_aq: 공기질 예측용출력(Outputs):y₀ = sad × w_tempy₁ = sad × w_humiy₂ = sad × w_aq이렇게 하나의 입력값을 각기 다른 가중치와 곱해서 3개의 예측값을 동시에 얻을 수 있습니다.2. 의사코드(Pseudocode)fun..
1. 프로젝트 생성IDE(또는 터미널)에서 새 콘솔 애플리케이션 프로젝트를 만듭니다.예: “SimpleNN”기존 프로젝트를 복제(clone)해서 사용해도 좋습니다.생성 후, 기본으로 잡혀 있는 main.c 외에 두 개의 파일을 추가합니다.simple_nn.h (헤더 파일)simple_nn.c (구현 파일)2. 헤더 파일: simple_nn.h#ifndef SIMPLE_NN_H#define SIMPLE_NN_H/** * @brief 단일 입력·단일 출력 퍼셉트론 예측 함수 * @param input 관측값 (e.g., 온도) * @param weight 가중치 * @return 예측값 (input × weight) */double predict(double input, double weight);#end..
단일 입력·단일 출력 신경망 구조flowchart LR Input[입력값 x] --> Mult[× 가중치 w] Mult --> Pred[예측값 y_pred]입력(Input, x): 예측에 사용할 관측치(예: 그날의 온도)가중치(Weight, w): 입력값의 중요도를 나타내는 파라미터예측값(Predicted Value, y_pred): 입력×가중치 연산 결과로 도출되는 값감정 분류 예시: 온도 → 행복/슬픔문제 정의주어진 온도 x로부터 “행복” 또는 “슬픔” 상태를 예측숫자 스케일링y_pred > 10이면 행복(happy)y_pred ≤ 10이면 슬픔(sad)추후 학습할 내용단어(감정 상태) → 숫자 값으로 인코딩하는 방법은 뒤쪽 강의에서 다룹니다.순전파 의사코드(Pseudocode)# 입력 x..