카테고리 없음

0626 새싹일지

gamnyam 2024. 6. 26. 16:51

자연어 처리와 시계열 예측은 같은 분야임.

 

위키독스 딥러닝을 이용한 자연어 처리 입문, 파이썬을 이용한 트레이

 

<오전>

 

딥러닝

 

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_1x2x_2
  • 하나의 출력 노드 yy
  • 가중치 w1w_1w2w_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 : 확률적 경사하강

 

-------

구글 코랩으로 실습

 

주어진 코드는 인공 신경망을 사용하여 간단한 회귀 문제를 해결하는 과정을 보여줍니다. 다음은 코드의 각 부분에 대한 자세한 설명입니다.

데이터셋 생성

python
코드 복사
def make_dataset(): x = np.random.uniform(low=-2, high=2, size=200) # -2부터 2까지의 구간에서 200개의 랜덤 숫자 추출 noise = [] for i in x: r = np.random.normal(loc=0.0, scale=(0.2 + (i**2)/3)) # 각 x 값에 대해 정규 분포를 따르는 노이즈 생성 noise.append(r) y = 1.5*x + 3 + np.array(noise) # y는 1.5*x + 3 + 노이즈 return x, y import matplotlib.pyplot as plt x, y = make_dataset() plt.plot(x, y, 'o') plt.show()
  • make_dataset() 함수는 -2부터 2까지 균일하게 분포된 200개의 랜덤 값을 생성합니다.
  • 각 x 값에 대해 정규 분포 노이즈를 추가하여 y 값을 생성합니다.
  • 생성된 데이터셋을 산점도로 시각화합니다.

데이터 분할

python
코드 복사
from sklearn.model_selection import train_test_split x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2)
  • train_test_split 함수로 데이터를 훈련 세트와 테스트 세트로 분할합니다.
  • 테스트 세트는 전체 데이터의 20%를 차지합니다.

모델 정의 및 컴파일

python
코드 복사
import tensorflow as tf model = tf.keras.Sequential() # Sequential 모델 객체 생성 model.add(tf.keras.layers.Dense(units=1, input_shape=(1,))) # 단일 유닛을 가진 Dense 레이어 추가 model2 = tf.keras.Sequential() model2.add(tf.keras.layers.Dense(units=2, input_shape=(3,))) model2.summary() # 두 번째 모델의 요약 출력
  • model은 단일 레이어와 단일 유닛을 가진 간단한 선형 회귀 모델입니다.
  • model2는 예시로 추가된 모델로, 3차원 입력을 받는 2개의 유닛을 가진 레이어를 추가합니다. model2의 구조를 출력합니다.

모델 컴파일

python
코드 복사
model.compile(optimizer=tf.keras.optimizers.SGD(), loss='mse')
  • 모델을 컴파일합니다.
  • 최적화 함수로 SGD(Stochastic Gradient Descent)를 사용하고, 손실 함수로 MSE(Mean Squared Error)를 사용합니다.

모델 학습

python
코드 복사
history = model.fit(x_train, y_train, epochs=100, validation_split=0.2)
  • fit 메서드를 사용하여 모델을 학습시킵니다.
  • 학습 데이터의 20%를 검증 데이터로 사용하며, 총 100번의 에포크 동안 학습합니다.
  • 학습 과정의 기록은 history 객체에 저장됩니다.

학습 결과 시각화

python
코드 복사
epochs = np.arange(1, 101) plt.plot(epochs, history.history['loss'], label='loss') plt.plot(epochs, history.history['val_loss'], label='val_loss') plt.legend() plt.show()
  • 학습 손실과 검증 손실의 변화를 시각화합니다.
  • 에포크별로 손실 값을 플롯합니다.

예측 및 결과 시각화

python
코드 복사
y_pred = model.predict(x_test) plt.plot(x_test, y_test, 'o') plt.plot(x_test, y_pred, 'o') plt.show()
  • 테스트 데이터에 대해 모델이 예측한 값을 y_pred에 저장합니다.
  • 실제 값과 예측 값을 시각화하여 비교합니다.

모델 가중치 출력

python
코드 복사
print(model.get_weights()[0][0]) # w_1(가중치) \
print(model.get_weights()[1][0]) # b_1(바이어스)
 
  • 학습된 모델의 가중치와 바이어스를 출력합니다.
  • 첫 번째 레이어의 가중치와 바이어스를 가져와 출력합니다.

요약

이 코드는 인공 신경망을 사용하여 선형 회귀 문제를 해결하는 예시를 보여줍니다. 데이터 생성부터 학습, 예측, 시각화, 그리고 모델 가중치 추출까지의 전체 과정을 포함하고 있습니다.

 

---------

 

실습과제

 

# 실습 과제
# AND
x_data = [[0,0],
          [0,1],
          [1,0],
          [1,1]]
y_data = [[0],
          [0],
          [0],
          [1]]


x_data = np.array(x_data)
y_data = np.array(y_data)

# model 을 생성해서 학습을 시켜 보세요
# AND, OR, XOR 연산기를 만들어 보세요