한주 한주 지나갈수록 노드들이 어려워지고 있다.
정신없이 집중해서 하다보면 어느새 금요일인 느낌이다.
그래도 이번주의 마무리로 한주를 정리해보고자 한다.
[4주차 정리]
1. Fundametals Node
◈ 터미널로 배우는 리눅스 운영체제
이전에 배웠던 터미널의 복습과 리눅스 기반의 운영체제, 명령어들을 다루었다.
- 정리
운영체제란?
운영체제는 컴퓨터라는 대저택을 관리하는 집사와 같은 존재로 볼 수 있다.
집주인(최고관리자)의 권한을 위임받아 요리사, 정원사, 청소부 등
각각의 보조 인원(어플리케이션)들에게 재산(연산 자원)을 적절히 분배하여 운영하고,
서로 권한을 침범할 수 없도록 관리하는 역할을 맡는다.
셸이란?
GUI(Graphical User Interface)와 CLI(Command Line Interface) 셸이 있으며,
GUI셸은 윈도우의 경우 시작버튼을 포함하는 Window shell, 맥 OS는 Aqua, 리눅스계열에는 GNOME 등이 있으며
단독으로 동작하기보다는 다른종류의 프로그램들과 함께 사용된다.
CLI셸은 윈도우 운영체제의 cmd.exe와 PowerShell이 있고,
우분투 및 맥 OS에서는 sh와 몇가지 편의기능을 덧붙인 bash가 있다.
프로세스 : 운영체제가 메모리를 할당하는 작업단위
스레드 : 프로세스가 할당받은 메모리를 활용하는 실행단위
멀티프로세싱 : 하나의 프로그램 안에서 여러개의 프로세스를 활용함.
멀티스레딩 : 하나의 프로세스 안에서 여러개의 스레드를 활용함.
chmod : 대상 파일의 권한을 변경하는 명령어(000 : 권한없음, 755 : 모든권한)
만화로 배우는 리눅스 시스템 관리 1 : 명령어 & 셸 스크립트 입문
◈ 데이터를 한눈에! Visualization
파이썬 라이브러리(Pandas, Matplotlib, Seaborn)를 이용해서 그래프를 그려보자
- 정리
%matplotlib inline : IPython에서 사용하는 매직 메소드
Rich output : 그래프와 같은 그림, 소리, 애니메이션과같은 결과물.
#그래프 데이터
subject = ['English', 'Math', 'Korean', 'Science', 'Computer']
points = [40, 90, 50, 60, 100]
# 축 그리기
fig = plt.figure()
# plt.figure() : 아무런 표시가 없는 하얀 박스형성
# (ex] plt.figure(figsize=(5,2)) : 가로 세로 비율 5:2인 그래프 판 형성)
ax1 = fig.add_subplot(2,2,1)
# fig.add_subplot(2,2,1) : 전체 판을 2x2형태로 나눈후 왼쪽 상부에 그래프 판 형성
# (2,2,2 : 오른쪽 상부, 2,2,3 : 왼쪽 하부 등)
# 그래프 그리기
# ax1.bar(x축, y축)
ax1.bar(subject,points)
# 라벨, 타이틀 달기
plt.xlabel('Subject')
plt.ylabel('Points')
plt.title("Yuna's Test Result")
◈ 사이킷런으로 구현해 보는 머신러닝
Exploration Node들을 진행하면서 사용했었던 사이킷런에대해서 자세하게 알아보는 node였다.
- 정리
머신러닝 알고리즘
머신러닝 알고리즘 종류는 크게 3가지로 나눌 수 있다.
1) 지도학습 / 2) 비지도학습 / 3) 강화학습
이 3가지의 카테고리는 상황이나 구현하고자 하는 Application에 따라 합쳐서 사용될 수 있다.
이 카테고리에 따라서 사용할 머신러닝 알고리즘이 정해진다.
무슨 알고리즘을 사용해야될지 감이 잘 잡히지 않을 때는 알고리즘 치트시트를 활용하여 정할 수 있다.
사이킷런은 파이썬 기반 머신러닝 라이브러리로 Scipy 및 NumPy 와 비슷한 데이터 표현과 수학 관련 함수를 갖고 있다.
사이킷런에서의 데이터 표현방식은 특성행렬(Feature Matrix)와 타겟벡터(Target Vector)로 표현한다.
특성행렬은 데이터의 갯수(n_samples)와 데이터들이 가지고 있는 특성(n_features)로 이루어져있다.
타겟벡터는 입력데이터의 라벨(정답 : n_samples)을 가지고있으며,
위의 그림에서와 같이 특성행렬과 타겟벡터의 행 수(n_samples)는 같아야 한다.
[표1. 사이킷런 주요 API정리]
비고 | 모듈명 | 설명 |
데이터셋 | sklearn.datasets | 사이킷런에서 제공하는 데이터셋 |
데이터타입 | sklearn.utils.Bunch | 사이킷런에서 제공하는 데이터셋의 데이터 타입(자료형) |
데이터 전처리 | sklearn.preprocessing | 데이터 전처리(정규화, 인코딩, 스케일리 등) |
데이터분리 | sklearn.model_selection.train_test_split | 학습용/테스트용 데이터셋 분리 |
평가 | sklearn.metrics | 분류, 회귀, 클러스터링 알고리즘의 성능을 측정하는 함수를 제공 |
머신러닝 알고리즘 (모델) |
sklearn.ensemble | 앙상블 관련 머신러닝 알고리즘 - 랜덤 포레스트, 에이다 부스트, 그래디언트 부스팅 |
sklearn.linear_model | 선형 머신러닝 알고리즘 - 릿지, 라쏘, SGD 등 | |
sklearn.naive_bayes | 나이브 베이즈 관련 머신러닝 알고리즘 | |
sklearn.neighbors | 최근점 이웃 모델 관련 - 릿지, 라쏘, SGD 등 | |
sklearn.svm | SVM관련 머신러닝 알고리즘 | |
sklearn.tree | 트리 관련 머신러닝 알고리즘 - 의사결정 트리 등 | |
sklearn.cluster | 군집관련 머신러닝 알고리즘 |
# 사이킷런 예제
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
# 데이터셋 로드하기
# 사이킷런에서 제공하는 dataset중 wine 데이터를 로드함.
data = load_wine()
# 훈련용 데이터셋 나누기
train_test_split(문제, 답지, 테스트데이터로 사용할 비율, 섞는 정도)
X_train, X_test, y_train, y_test = train_test_split(data.data, data.target, test_size=0.2, random_state=11)
# 모델은 의사결정나무에서 발전된 랜덤포레스트를 가져왔다.
model = RandomForestClassifier()
# 훈련하기
# .fit(문제, 답)
model.fit(X_train, y_train)
# 예측하기
y_pred = model.predict(X_test)
# 정답률 출력하기
print("정답률=", accuracy_score(y_test, y_pred))
2. Exploration Node
◈ 사람이 말하는 단어를 인공지능 모델로 구분해보자
저번주에 진행했었던 영화리뷰 텍스트 감성분석하기에서 한발 더 나아간 노드였다.
음성데이터인 음성데이터를 분석하여 해당 text라벨을 출력하는 모델을 만들어보았다.
인공지능하면 생각나는 것들을 하나둘씩 해보는 느낌이었다.
물론 재밌는 느낌이랑 노드를 진행하는 건 다른의미지만..
음성인식이라는 분야는 재밌는 분야같아보였다.
엄청 어렵고 이해안되는부분도 많았지만서도 음성을 인식해서 text로 변환하는 과정들은 놀라웠다.
음성인식이 시각화랑 연관된다면 재밌을 것 같았다.
누군가는 귀가 안들리고 누군가는 눈이 안보일 때,
눈이 안보이시는 분이 말을하시면 그걸 시각화해서 귀가 안들리는분께 보여드리고
귀가 안들리시는분이 글을 쓰거나 그림을 그리면
그걸 눈이 안보이는 분께 읽어드리는 기계도 생기면 좋겠다.
의사소통에 필요한 어느 한부분이 부족해도 자연스럽게
의사소통이 가능하면 좋을 것 같다는 생각을 했다.
Spectrogram classification project github (차후 링크예정)
◈ 작사가 인공지능 만들기
기존에 했던 자연어 처리들이 단순하게 말해서 분류하는 모델이었다면,
이번에 학습했던 모델은 단어들의 관계를 통해서 문장을 만들어주는 모델이었다.
네이버 감성리뷰분석에서 활용했던 토큰화를 활용하여 데이터를
숫자로 변환하고 이들사이의 관계를 찾는 작업을 진행하고 학습시켜
내가 단어 혹은 문장의 일부를 적었을때 이에 어울리는 가사를 결과물로 만들어 주었다.
어려운 코드부분들을 그림이나, 블럭같은 형태로 변환해서
어린친구들을 교육할 때 활용해도 재밌을 것 같은 느낌이었다.
거기다 추가적으로 가사 느낌에 맞는 음악도 만들 수 있다면
이러한 자연어처리에 대한 부담감이나 어려움보다 재미가 먼저 생길 수 있을 것 같았다.
나중에 기회가 되면 만들어 보고싶었다.
작사가 인공지능 만들기 project github (차후 링크예정)
3. 알고리즘
◈ 4주차
이번주에 풀이했던 부분은 7장 배열이었다.
알고리즘 공부시간은 매번 코드를 치는 시간보다 이 문제를 어떻게 풀어야 할지 생각하는 시간이 더 길었다.
내가 코드를 잘 짜는 것도 아니고, 그렇다고 논리적인 사고를 잘 하는 것도 아니어서
생각한 대로 코드를 짜고나서 돌려보면 번번히 오류가 발생하거나, 예상한 답과 달랐다.
저번주에는 하루에 하나씩 풀어보고자 생각했고, 그렇게 해보려고했지만
생각보다 한문제 한문제 푸는게 시간이 오래걸렸다.
생각하고 코드를 적고 돌려보고 틀려서 다시 생각하고 코드를 적고 돌려보고 하면 2~3시간은 훌쩍 갔다.
아무래도 알고리즘공부는 계속 반복적으로 해야할 것 같다.
4. DeepML(CS231n)
◈ 4주차 (Lecture 4 : Regularization + Optimization) :
정규화와 최적화에 대하여
들어가기전에 꼭보시기 바랍니다. 두번보세요. 머릿속에 인스톨되는 딥러닝입니다.
- Epoch?
전체 데이터를 이용하여 한 바퀴 돌며 1회 학습하는 것
- Step
Weight와 Bias를 업데이트 하는 것
- Batch Size?
1Step에서 사용한 데이터의 수
Batch Size가 100이고 Step이 5면 500개의 데이터를 이용한 것이다
- Loss Function?
손실함수(Loss Function)는 분류기가 얼마나 좋은가를 알려주는 함수이다. 점수가 낮을수록 좋은 분류기라고 정의한다.
이 강의에서는 SVM Loss, Cross entrophy를 다룬다.
- Random Search
수많은 임의 가중치 행렬값을 랜덤하게 가중치를 임의로 선택하여 해당 가중치에 대한 로스를 계산한다.
가중치 중에 가장 낮았을때의 W를 저장한다.
- SOTA란?
State-of-the-art의 줄임말이며 최신기술이라고 생각하면 될 것 같다.
- Follow the slope(Numerical gradient)
numeric한 방법은 너무 느려서 현재 잘 사용하지 않는다.
결국 ax+b = y에서 기울기 a를 찾는 방법임.
a = 0인 부분이 결국은 W의 죄적값임.
수치적으로 gradient를 담아준다.
추정하는 방법이면서 W를 구할 수 있지만 매우 느림.(더듬 더듬거리면서 경사를 내려가는방법)
- 경사하강법(Gradient Descent) = Batch Gradient Descent
Weight gradient가 움직이는 반대 방향으로 움직이면서 가장 최적의 W를 찾아간다.
- Mini-batch Gradient Descent
전체 데이터를 사용하지 않고 데이터중의 일부를 가지고 W를 찾는 방법
- Stochastic Gradient Descent (SGD)
앞에서 말한 BGD를 연속적으로 이어서 사용한 방법
- SGD+Momentum
SGD로 가는것도 길다(느리다.) 그래서 가는 방향으로 관성을 줘서 좀더 빠르게 갈 수 있게 생각하겠다.
(공이 경사로 굴러가는 것처럼)
- Nesterov Momentum
바뀔 w(gradient)를 계산해 미리 더한다.
- AdaGrad
‘지금까지 많이 변화하지 않은 변수들은 step size를 크게 하고,
지금까지 많이 변화했던 변수들은 step size를 작게 하자’
- RMSprop
saddle point에서 발생할 수 있는 문제점을 해결하는 것
P60 Q1: What happens with AdaGrad?
Q1 : AdaGrad를 쓰면 뭐가 바뀌나요?
A1 : 변화가 큰곳은 스텝수를 작게하고, 변화가 적은 곳은 스텝수를 크게한다.
P67 Q2: What happens at t=0? (Assume beta2 = 0.999)
Q2 : Adam을 쓸때 초기값을 0으로 주게되면 어떤 문제가 발생하나요?
A2 : 초기값를 0으로 주게되면 최적값에 도달했다고 판다하여 0으로 편향되게 된다. 그래서 편향에 관한 보정을 하였다.
답변 참고 블로그 링크
"GPT-3" 2020년 5월에 OpenAI에서 발표한 모델이다.
몇몇 사람은 OpenAI에서 제공한 API를 활용하여 많은사람들이 재밌게 이것 저것 만들면서 이슈가 된 적이 있다.
그 중 어떤 사람은 이를 활용해서 영어로 문장을 적으면 리액트코드를 만들어주는 인공지능을 만들었고,
또 어떤 사람은 영어로 적용할 부분들을 문장으로 적고 이를 SQL로 구현해주는 인공지능을 만들었다.
빠르게 변화하고있는 인공지능 시장에서 이제 첫걸음을 시작했다.
아직 한발을 채 걷지도 못했지만 앞으로의 6개월을 기대한다.
'[SSAC X AIFFEL]' 카테고리의 다른 글
[6주차]SSAC X AIFFEL (02.01~02.05) (0) | 2021.02.06 |
---|---|
[5주차]SSAC X AIFFEL (01.25~01.29) (0) | 2021.01.29 |
[3주차]SSAC X AIFFEL (01.11~01.15) (1) | 2021.01.15 |
[2주차] AI 개발자로 가는 첫걸음 (01.04~01.08) (0) | 2021.01.08 |
[SSAC X AIFFEL]앞으로의 목표 (2) | 2020.12.31 |