자연어 처리와 시계열 예측은 같은 분야임.
위키독스 딥러닝을 이용한 자연어 처리 입문, 파이썬을 이용한 트레이
<오전>
딥러닝
GAN ganarative? 생성하다
linear regression, logistic regression 아이디어 차용
전처리 과정은 딥러닝에서도 똑같이 사용
뉴럴 네트워크
샘플을 모델에 집어넣으면 -> 확률 내보냄
0.5 이상이면 고양이, 미만이면 고양이 아님
고양인지 개인지 판단하는 문제는?
확률을 합쳤을 때 1이어야함.
[고양이, 개] [x, y]
x+y =1
0 =< x,y =< 1
[1, 0]
cf) 숫자분류 5인지 5가 아닌지
숫자 5면 true, 아니면 false
모델에 집어넣으면
x 출력
0=< x =< 1
0.3 (숫자 5일 확률)
0.8 (숫자 5일 확률)
=> 다중분류
data - label => one - hot 인코딩
이중분류 문제를 이용해 다중분류 문제를 해결할 수 있다
다 더했을 때 1, 각각은 0과 1 사이에
리니어 리그리션 : 직선 예측
=> 분류 문제 해결 가능
(로지스틱 리스리션 사용 -> 분류 문제 해결 가능)
* one hot encoding
data set : inputdata(이미지를 벡터로 만들어줌)
label(target, y) data는 1 or 0 으로 구성
출력의 형태가 1차
사과인지 아닌지 판단하는 모델
사과이미지 -> model(sigmoid)-> 사과인지 아닌지 판단하는 확률이 나옴.(0.8)
확률로 바꿔주는 애가 sigmoid
0.2는 사과가 아닐 확률일 것이다.
사과, 포도, 배 세개를 분류하는 모델
사과일 확률, 포도일 확률, 배일 확률이 나와야함.
data set : inputdata(이미지를 벡터로 만들어줌)
label(target, y) data는 1 or 0 으로 구성
사과, 포도, 배 이미지 -> model(softmax)-> [0.8, 0.1, 0.1]
사과 이미지를 넣고 학습을 시키면 [1, 0, 0] (라벨을 단다고 생각)
포도를 넣고 학습시키면 [0, 1, 0]
(사과, 포도, 배를 구분하는 모델로 바뀜)
시그모이드를 일반화 하는 애 : sofrmax
출력의 형태는 3차원
dummy 이용하면 사과, 포도, 배, 아무것도 아닌것 // 이렇게 분류할 수 있음
수업 10:40 다시 듣기
딥러닝이 '잘모르겠다'는 잘 대답하지 못함. 무조건 사과, 포도, 배 중에 대답해야함.
사과 인지 아닌지 model
Data set : inputdata(image2vec) : label(1 or 0 ) 출력의 형태가 1차원
사과 이미지 -> model1(Sigmoid)-> 0.8(사과일 확률이 80% 이다.)
포도 이미지 -> model2(Sigmoid)-> 0.7(포도일 확률이 80% 이다.)
배 이미지 -> model3(Sigmoid)-> 0.9(배일 확률이 80% 이다.)사과, 포도, 배
사과 1
포도 2
배 3
Data set : inputdata(image2vec) : label([1, 0, 0]) 출력의 형태가 3차원
사과 이미지 -> model(Softmax)-> [0.8, 0.1, 0.1]
뉴럴 네트워크도 동물이 생각하는 방식과 비슷하게 만들지만 완전 동일하게 만드는건 아님
퍼셉트론 / 뉴럴넷
모든 구조는 인간의 생각을 모방해서 만듦
퍼셉트론
x1, x2 : 입력
y : 출력
w1, w2 : 가중치
y = w1x1 + w2x2
가중을 곱해서 입력된 값을 그대로 전달
우리는 특정값 이상이면 전달, 이하면 전달 안되는걸 원함
treash hold = 특정값
y = 0 or 1로 출력되는걸로 만들고 싶음
y = 0( w1x1 + w2x2 =< 세타)
= 1 ( w1x1 + w2x2 >세타)
가중치를 학습하는게 딥러닝
가중치로 네트워크 만듦.
딥러닝은 가중치를 최적화한다.
AND, OR, NAND : 입력 2개
y = ax + b
b = 2/3
a = -1
y = -x + 2/3
가중치가 같더라도 어떻게 분류되느냐에 따라(threadsh hold에 따라)
and 연산 or 연산
퍼셉트론을 어떻게 만들까 생각해보기
thresh hold 값은 b(bias)
XOR은 두 개의 연산이 필요, 발전이 더딤.
알렉스넷? 나올때까지 불편하게 함
엔비디아 GPU 위주로 발전하기 시작
XOR 그래프 : 비선형
퍼셉트론은 직선만 표현 가능
XOR을 표현하기 위해 OR 직선 2개
딥러닝은 그래프르를 역으로도 그릴 수 있음..
----------------
AND와 OR 연산을 수행하는 신경망에 대해 설명해드리겠습니다. 신경망은 다양한 논리 연산을 수행할 수 있으며, AND와 OR 연산은 그 중 기본적인 예시입니다. 이 예시는 단층 퍼셉트론(single-layer perceptron)을 통해 구현할 수 있습니다.
단층 퍼셉트론
단층 퍼셉트론은 가장 간단한 형태의 신경망으로, 하나의 선형 분리기로 데이터를 분류합니다. 각 입력 노드는 가중치(weight)를 가지며, 입력 값에 가중치를 곱한 값의 합을 활성화 함수(activation function)에 적용하여 출력 값을 결정합니다.
AND 연산
AND 연산의 진리표는 다음과 같습니다:
Input 1Input 2Output
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
AND 연산을 수행하는 단층 퍼셉트론의 구조는 다음과 같습니다:
- 두 개의 입력 노드 x1x_1과 x2x_2
- 하나의 출력 노드 yy
- 가중치 w1w_1과 w2w_2
- 편향(bias) bb
퍼셉트론의 출력은 다음과 같이 계산됩니다:
y=step(w1x1+w2x2+b)y = \text{step}(w_1 x_1 + w_2 x_2 + b)
여기서 step 함수는 입력이 0 이상이면 1을 출력하고, 그렇지 않으면 0을 출력하는 활성화 함수입니다.
AND 연산을 수행하기 위해 다음과 같은 가중치와 편향을 사용할 수 있습니다:
- w1=1w_1 = 1
- w2=1w_2 = 1
- b=−1.5b = -1.5
이 경우, 퍼셉트론의 출력은 다음과 같이 계산됩니다:
- x1=0x_1 = 0이고 x2=0x_2 = 0일 때: 1⋅0+1⋅0−1.5=−1.51 \cdot 0 + 1 \cdot 0 - 1.5 = -1.5 (출력 0)
- x1=0x_1 = 0이고 x2=1x_2 = 1일 때: 1⋅0+1⋅1−1.5=−0.51 \cdot 0 + 1 \cdot 1 - 1.5 = -0.5 (출력 0)
- x1=1x_1 = 1이고 x2=0x_2 = 0일 때: 1⋅1+1⋅0−1.5=−0.51 \cdot 1 + 1 \cdot 0 - 1.5 = -0.5 (출력 0)
- x1=1x_1 = 1이고 x2=1x_2 = 1일 때: 1⋅1+1⋅1−1.5=0.51 \cdot 1 + 1 \cdot 1 - 1.5 = 0.5 (출력 1)
OR 연산
OR 연산의 진리표는 다음과 같습니다:
Input 1Input 2Output
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
OR 연산을 수행하는 단층 퍼셉트론의 구조는 AND 연산과 유사하지만, 다른 가중치와 편향을 사용합니다:
- w1=1w_1 = 1
- w2=1w_2 = 1
- b=−0.5b = -0.5
이 경우, 퍼셉트론의 출력은 다음과 같이 계산됩니다:
- x1=0x_1 = 0이고 x2=0x_2 = 0일 때: 1⋅0+1⋅0−0.5=−0.51 \cdot 0 + 1 \cdot 0 - 0.5 = -0.5 (출력 0)
- x1=0x_1 = 0이고 x2=1x_2 = 1일 때: 1⋅0+1⋅1−0.5=0.51 \cdot 0 + 1 \cdot 1 - 0.5 = 0.5 (출력 1)
- x1=1x_1 = 1이고 x2=0x_2 = 0일 때: 1⋅1+1⋅0−0.5=0.51 \cdot 1 + 1 \cdot 0 - 0.5 = 0.5 (출력 1)
- x1=1x_1 = 1이고 x2=1x_2 = 1일 때: 1⋅1+1⋅1−0.5=1.51 \cdot 1 + 1 \cdot 1 - 0.5 = 1.5 (출력 1)
결론
단층 퍼셉트론은 AND와 OR 연산을 성공적으로 수행할 수 있습니다. 각 연산에 필요한 가중치와 편향을 적절히 설정하면 입력 값에 따라 원하는 논리 연산을 구현할 수 있습니다. 이러한 기본 논리 연산을 신경망으로 구현하면, 더 복잡한 논리 연산 및 패턴 인식을 위한 기초를 마련할 수 있습니다.
-----------
밑바닥부터 시작하는 딥러닝 p.50까지 읽기
<오후>
활성화 함수 (필기하기)
step function과 유사하게 확률로 바꿔서 나오게하는거 : 시그모이드 (0 기준으로 바뀜)
identity function은 자기만 내보냄
로지스틱 * : 0~1 사이 값을 내보냄
tanH : -1 ~ 1 사이 값을 내보냄
퍼셉트론 구현 중
기본(AND, OR) 직선으로 분류
입력은 2개(x1, x2), 편향은 1개(b, bias), 가중치는 2개(w1, w2)
h(a)는 식을 0 또는 1로 만들어주는 애
h(a) 는 활성화함수(activation function)
활성함수는 재사용 가능
Q. h(a) = a 인 활성화함수는?
잘 안쓴다. 그이유는?
입력한 값을 그대로 출력함. 뉴럴네트워크를 깊게 쌓을 필요가 없어짐. (이럼 딥러닝에서 의미가 없는듯?)
Rectified linear unit : 정보를 손실하냐마냐의 차이
0은 정보를 버리고, 0보다 크면 정보를 그대로 가져가는 느낌..
텐서플로 다운받을 때 한양남자 유튜브 참고
텐서플로, 케라스 => 코랩으로 사용할 것.
파이토치 => 메타에서 개발
파이토치 lighting
손실함수(cost func) : MSE 등
옵티마이저 : 최적화 (경사하강법 등)
가중치 업데이트 : w= w+알파 어쩌구
한 번 가중치 업데이트하는거 : 1step
1epoch
입력에 들어가는 한 뭉탱이 : 배치
layer란?
0차원 : 스칼라
1차원 : 벡터
2차원 : 매트릭스
3차원 : 볼륨
4차원 : 4차원 텐서
layer는 가중치 덩어리(가중치를 모아둠)
레이어 종류 보통 완전 연결층, 밀집층 거의 비슷한 말
순환층 : 시계열 데이터 분석시
합섭곱층 : 컴퓨터비전
최종 노드의 개수는 출력의 수
파라미터 2개 : 가중치가 2개 있다
(가중치 1개, bias 1개)
if) 노드가 2개(동그라미)
input이 3개
SGD : 확률적 경사하강
-------
구글 코랩으로 실습
주어진 코드는 인공 신경망을 사용하여 간단한 회귀 문제를 해결하는 과정을 보여줍니다. 다음은 코드의 각 부분에 대한 자세한 설명입니다.
데이터셋 생성
- make_dataset() 함수는 -2부터 2까지 균일하게 분포된 200개의 랜덤 값을 생성합니다.
- 각 x 값에 대해 정규 분포 노이즈를 추가하여 y 값을 생성합니다.
- 생성된 데이터셋을 산점도로 시각화합니다.
데이터 분할
- train_test_split 함수로 데이터를 훈련 세트와 테스트 세트로 분할합니다.
- 테스트 세트는 전체 데이터의 20%를 차지합니다.
모델 정의 및 컴파일
- model은 단일 레이어와 단일 유닛을 가진 간단한 선형 회귀 모델입니다.
- model2는 예시로 추가된 모델로, 3차원 입력을 받는 2개의 유닛을 가진 레이어를 추가합니다. model2의 구조를 출력합니다.
모델 컴파일
- 모델을 컴파일합니다.
- 최적화 함수로 SGD(Stochastic Gradient Descent)를 사용하고, 손실 함수로 MSE(Mean Squared Error)를 사용합니다.
모델 학습
- fit 메서드를 사용하여 모델을 학습시킵니다.
- 학습 데이터의 20%를 검증 데이터로 사용하며, 총 100번의 에포크 동안 학습합니다.
- 학습 과정의 기록은 history 객체에 저장됩니다.
학습 결과 시각화
- 학습 손실과 검증 손실의 변화를 시각화합니다.
- 에포크별로 손실 값을 플롯합니다.
예측 및 결과 시각화
- 테스트 데이터에 대해 모델이 예측한 값을 y_pred에 저장합니다.
- 실제 값과 예측 값을 시각화하여 비교합니다.
모델 가중치 출력
- 학습된 모델의 가중치와 바이어스를 출력합니다.
- 첫 번째 레이어의 가중치와 바이어스를 가져와 출력합니다.
요약
이 코드는 인공 신경망을 사용하여 선형 회귀 문제를 해결하는 예시를 보여줍니다. 데이터 생성부터 학습, 예측, 시각화, 그리고 모델 가중치 추출까지의 전체 과정을 포함하고 있습니다.
---------
실습과제