본문 바로가기
TIL/Boostcamp AI tech

[Boostcamp] Week 1 - Day 1. 하루 정리 :: seoftware

by seowit 2021. 8. 3.

 

목차
1. 강의정리
    1-1. AI Math - chap1. 벡터
    1-2. AI Math - chap2. 행렬
    1-3. AI Math - chap3. 경사하강법(순한맛)
    1-4. AI Math - chap4. 경사하강법(매운맛)
2. 과제
    2-1. Basic Math
    2-2. Text Processing Ⅰ
    2-3. Text Processing Ⅱ
3. 피어세션 정리
4. 데일리 회고 

 


📜 강의 정리 


[AI Math] Chapter1. 벡터가 뭐예요?

 

  • 벡터란 숫자를 원소로 가지는 리스트 또는 배열이다

열벡터, 행벡터, 벡터차원

  • 코드

 

import numpy as np
x = [1, 2, 3]
y = np.array([1, 4, 2])

 

  • 공간에서의 한 점을 나타내고, 원점으로부터의 상대적 위치를 표현한다
    • 벡터에 숫자를 곱해주면 길이만 변한다 - 스칼라곱
  • 벡터간의 연산
    • 같은 모양의 벡터끼리는 덧셈, 뺄셈이 가능하고, 상대적 위치 이동을 의미한다
    • 같은 모양이면 성분곱(Hadamard product, ⨀, element-wise) 계산 가능
    • import numpy as np
      
      x = np.array([1, 2, 3])
      y = np.array([4, 5, 6])
      
      print(x + y)  # array([5, 7, 9])
      
      print(x - y)  # array([-3, -3, -3])
      
      print(x * y)  # array([4, 10, 18])
  • 벡터의 노름
    • 원점으로부터의 거리
    • 표현 방법 : ‖ ‖
    • 노름의 종류에 따라 기하학적 성질이 달라짐
    • 종류1. L1-norm : 변화량의 절대값의 합
    • 종류2. L2-norm : 유클리드 거리, np.linealg.norm을 이용하여 구현 가능
      L1 노름, L2 노름
    • 노름의 종류에 따라 기하학적 성질이 달라진다.

L1 norm과 L2 norm 의 기하학적 성질 및 머신러닝 적용 예 

  • 두 벡터 사이의 거리
    • L1, L2-노름을 이용
    • 벡터의 뺄셈을 이용, 거꾸로 해도 거리는 같다 ‖x - y‖ = ‖y - x‖  

벡터의 뺄셈을 이용한 거리 구하기

    • 두 벡터 사이의 각도
      • L2-노름만 가능!
      • 제2 코사인 법칙 이용, 분자를 쉽게 계산하는 방법이 내적(np.inner, 2<x, y>)

제2 코사인 법칙에 이한 두 벡터 사이의 각도 구하는 공식

    • import numpy as np
      
      def angle(x, y):
      	v = np.inner(x, y) / (l2_norm(x) * l2_norm(y))
          theta = np.arccos(v)
          return theta

[AI Math] Chapter2. 행렬이 뭐예요?

 

 


⦁ 행렬(matrix) : 벡터를 원소로 가지는 2차원 배열, 행벡터를 원소로 가짐
- 코드 : x = np.array([1, 1, 1], [2, 2, 2], [3, 3, 3])
- 규칙 1. 벡터는 소문자로, 행렬은 대문자로 표기
  규칙 2. x(i, j)는 i행의 j열 (행 먼저)
 
⦁ 전치행렬(X.t) : 행과 열의 인덱스가 바뀐 행렬
⦁ 행렬의 덧셈, 뺄셈, 성분곱(⨀), 스칼라곱은 벡터와 동일
⦁ 행렬 곱셈 != 벡터 곱셈
- X와 Y의 X의 행벡터와 Y의 열벡터의 내적(곱의 합)
- X의 열의 개수와 Y의 행의 개수가 같아야 한다.
- numpy에서 행렬 곱셈 연산 기호 : @
- * np.inner 는 행벡터 사이의 내적을 계산 - X와 Y의 행의 개수가 같아야 함 
⦁ 역행렬 : 행과 열 숫자가 같고 행렬식이 0이 아닌 경우에만 계산 가능
- 코드 : np.linalg.inv(X)
- X @ X(-1) = I (항등행렬 : 대각선이 1이고 나머지는 0에 가까운 수)
- 유사역행렬(Moore-Penrose) : 행과 열 숫자가 달라고 가능 X(+), np.linalg.pinv(X)
 


[AI Math] Chapter3. 경사하강법 순한맛


⦁ 미분 : 변수의 움직임에 따른 함수값의 변화를 측정하기 위한 도구, 변화율의 극한
- 코드 : import sympy as sym
from sympy.abc import x
sym.diff(sym.poly(x**2 + 2*x + 3), x)
- 경사상승법 : 함수를 증가시키고 싶으면 x + f'(x) 
- 경사하강법 : 감소시키고 싶으면 x - f'(x)
⦁ 변수가 벡터인 경우(다변수 함수)는 편미분을 사용
- e(i) 사용 : i번째 원소만 1이고 나머지는 0인 벡터
⦁ 선형회귀분석 : 무어펜로즈 역행렬 이용해서 선형회귀식 찾기

 


[AI Math] Chapter4. 경사하강법 매운맛


⦁ 경사하강법으로 선형회귀 계수 구하기 
- 선형회귀 목적식 ||y-Xi||2 를 최소화하는 i 찾아야함
- 아래 계산식 손으로 유도해보기
 
- 경사하강법
 
⦁ 경사하강법 
+ 볼록한 함수는 그레디언트가 최소점을 향한다
+ 적절한 학습률과 학습횟수를 선택했을 때 수렴이 보장
- 비선형회귀(non_linear) 문제의 경우 볼록하지 않을 수 있으므로 수렴이 보장 x
⦁ 확률적 경사하강법(Stochastic Gradient Descent) 
- 모든 데이터를 사용해서 업데이트하는 대신 데이터 한개 또는 일부 활용하여 업데이트 : 미니배치 연산
- 볼록이 아닌(non-convex) 목적식은 SGD를 통해 최적화 가능
- 데이터의 일부를 가지고 파라미터를 업데이트 하기 때문에 연산자원을 효율적으로 활용하는데 도움
- 매번 다른 미니배치를 사용하기 때문에 곡선 모양이 바뀜 -> non-convex 문제 해결

 



👩‍💻 과제 수행 과정


[필수과제] 1. Basic Math

아래 같은 기본적인 기능 포함하는 함수 몇 개 짜는게 끝이라 크게 기억에 남는건 없었고, 기나긴 테스트 코드가 신기했다. assert와 raise로 함수 기능이 잘못 되어 있으면 Error를 발생하는데 신기했다.

greatest_number = None
if number_list:
	number_list.sort()
	greatest_number = number_list[-1]
return greatest_number

 

[필수과제] 2. Text Processing Ⅰ

이 문제도 크게 어려운 점이 없었다. NLP를 사용하기 전에 텍스트 형식을 맞춰주는 함수 몇 개를 작성했다. 문자열을 다룰 때는 split과 join이 자주 사용되는 것 같다. 자주 join 할 때 string.join(" ") 이런식으로 구분자와 문자열의 자리를 바꾸어서 작성하는 실수를 한다.

# 소문자
input_string = input_string.lower()
# 띄어쓰기
input_string = input_string.split()
# 띄어쓰기 한칸
normalized_string = " ".join(input_string)

 

[필수과제] 3. Text Processing Ⅱ

언더스코어 형식으로 작성된 문자열을 카멜 형식으로 바꾸는 함수를 작성하였다. "alreadyCamel", "TEST" 등의 원래 언더스코어 형식이 아니었던 문자열은 그냥 반환해야 하는데 이 처리를 안 해줘서 테스트 코드에서 계속 에러가 발생했었다. 이 문제로 고민을 했었는데, 아래 세 줄로 해결되어서 허무하면서도 문제 이해의 중요성을 깨달았다.

# already camel
if "_" not in underscore_str:
	return underscore_str

🙋‍♀️피어세션

 

첫 날이라 강의 질문을 하기 보다는 그라운드룰을 정하고 피어규칙을 정하는 시간을 가졌다.

 

📍 조 이름 :  AIGO(아이고)

📍 모더레이터/팀원

    - 모더레이터 : 캠퍼 ID 순으로 매일 돌아가며 담당
    - 팀원: 김서원(1), 김승훈(2), 김신곤(3), 박아멘(4), 심현덕(5), 이상원(6) <총 6명>
      *( )가 순서 

📍 피어세션 플랜

    - 피어세션 시간: 월~금 4:30pm~6:00pm
    - 피어세션 장소: Online ZOOM
    - 피어세션에서 할 것
       1) 일주일 과제 및 강좌 스케줄링
       2) 수업 복습 (퀴즈 오픈일에 맞춰서 해당 강의 듣고 내용 정리해서 공유)
       3) 과제 이해 안 되는 부분 서로 질문
       4) 코드 리뷰 : 과제 제출 후

    -예시 (8/2 피어세션 스케줄링)
        8/2(월) - 퀴즈 1, 2, 3~4강 + 필수 과제 Basic Math, Text Processing1, 2
        8/3(화) - 퀴즈 5, 6강 + 필수 과제 Baseball, Morsecode
        8/4(수) - 퀴즈 7, 8, 9강 + 선택 과제 Gradient Descent, Backpropagation, Maximum Likelihood Estimation
        8/5(목) - 퀴즈 10강 + 선택 과제 계속

    -각자 해야 할 것
        1) 수업 정리 완성본 URL 또는 파일 제출 후 팀원에게 공유
        2) 참고자료/토론주제/질문 가져오기

    -모더레이터 할 것
        1) 회의록 작성
        2) 피어세션 회의록 업로드
        3) 피어세션 진행자
        4) 멘토님 약속 필요할 경우 contact
        5) 그 외 추가적인 임무

   -협업툴 : ZOOM(화상회의용), Github(코드리뷰), SLACK(데이터/문서 공유, 회의록 작성, 채팅용)

📍 피어 규칙
    1) 호칭은 ~님!
    2) 존댓말 사용하기
    3) 피어세션에 참여 못할 경우 전날 자정 전까지 말하기
    4) 무단불참/지각 1번째 기프티콘 (4시 30분 이후 참석)
    5) 선택과제도 최선을 다해서 끝내기

📍 Github organization : https://github.com/aigoigo


💌 데일리 회고

 

프리코스로 제공되었던 강의가 이번주 강의여서, 이번주는 널널할거라고 생각했는데 오산이다ㅋㅋㅋ

원래 일정은 피어세션이 16시 30분부터 18시까지인데 오늘은 첫 날이라 팀원들과 오전에도 줌미팅을 했다
무엇보다 다른 캠퍼님들을 직접 만나고 대화하는 것을 걱정했는데 괜찮았다
겪어보면 별 것 아닌데, 지레 겁먹고 시도도 안 해보는 적이 많다.
부캠을 하는 동안 오늘처럼 걱정했던 일이 막상 해보면 별 일 아니라는 생각을 계속 하며 용기내는 연습도 해봐야겠다.

인공지능 관련 강의를 많이 들었서 다 안다고 생각했는데, 오늘 경사하강법에 대한 강의를 남에게 설명을 할 수 없었다. 같은 주제의 강의를 여러 개를 보면서 항상 새로움을 느끼는 건 분명 문제가 있는거다. 부캠을 하는 동안 듣는 강의는 120% 이해하기 위해 제대로 이해했는지 남에게 설명할 수 있을 정도로 공부를 해야겠다! 다행히 부캠이 강의를 듣고 이해 안된 부분을 다른 캠퍼님들에게 질문 할 수 있는 환경이 잘되어 있어서 좋다!! 

평소였으면 10시면 자고 있었을텐데 부캠을 하려고 9시부터 눈이 떠져서 체크인을 하기 위해 대기했다. 이런 열정과 애정이 오래오래 지속되어서 쑥쑥 성장하고 싶다🌱

댓글