본문 바로가기

활동/SK네트웍스 Family AI 캠프 2기

SK네트웍스 Family AI 캠프 2기 : 11th week (7월 4주차) + 7월 회고

 

 

 

헉... 벌써 7월의 끝자락이네요! 

시간이 왜 이렇게 빨리 흘러가는 것인지 모르겠어요.

그만큼 공부에 열심히 집중했기에 더 그렇게 느껴지는 것 같습니다.

 

그리고 특히 이번 주에는 한 일들이 정말 많았습니다.

오늘도 편하게 조잘조잘 공부했던 것에 대해 이야기해보겠습니다!

 

공부는 가벼운 마음으로 꾸준히 하는 게 중요하다고 생각하거든요 ^_^

가벼운 질량이어도 꾸준히 가속도를 붙이다 보면, 이전보다 확실히 큰 힘이 되어 있는 것처럼 공부도 똑같은 것 같습니다!

그리고 처음만 느릴 뿐이지... 나중에는 공부에도 가속도가 붙어서 습득 속도 자체도 빨라져 있더라구요.

 

가벼운 마음으로 꾸준히 정진하겠습니다!!

 

 

● 성취

이번 주 금요일에 정처기 필기 시험을 봤습니다.

 

정보처리기사 관련하여 개발자들 사이에서 평이 많이 나뉘는 걸로 알고 있습니다.

저 역시 그것을 알고 있기에 자격증 취득에 대해 꽤 고민을 했습니다.

 

오랜 고민 끝에 결론을 내렸어요.

해당 자격증 공부는 IT 용어를 가볍게 훑어보기 위한 용도로 임하면 좋겠다는 생각이 들더라구요.

그래서 서점에 방문하여 최대한 간결하게 정리되어 있는 책을 골랐습니다.

 

저는 위 책을 골랐습니다 :)

 

결과는 합격!!

근데 저 책은 만점을 목표로 삼기에는 한계가 있고, 합격 커트라인을 효율적으로 넘기는 용도로 삼기 좋은 것 같습니다.

왜냐하면 지엽적인 개념은 저 책에 없더라구요.

혹시라도 정보처리기사 만점을 목표로 하시는 분들이 계실 수도 있으니까요...^^ 

 

빠른 시일 내에 IT 용어들을 훑어 봄으로써 합격을 효율적으로 하고 싶은 분들께 추천합니다!

 

● 학습

이번 주에는 AI 프레임워크에 대해 배웠습니다.

현 강사님께서는 기본기를 중요시하는 분이셔서, 공식 메뉴얼을 기준으로 코드 해석하는 법을 배웠습니다.

 

강사님을 일주일 정도 지켜본 결과, 3가지 공부 원칙을 발견할 수 있었습니다.

1. 기본 개념은 철저하게 원리에 입각해서 공부한다. (low level까지 내려가서 배우는 것을 두려워하지 말아야 합니다!)

2. 언어 및 프레임워크를 공부할 때는 창시자가 저술한 책과 공식 문서를 기준으로 삼는다.

3. 2번에 해당하는 내용을 더 확장하고 싶을 때는 GitHub 등의 오픈 소스 자료를 참고로 한다. (단, 2번을 항상 기준점으로 삼아야 한다.)

 

개발 공부에 애정이 깊은 사람이라면 위 공부법에 상당히 공감할 것 같습니다.

개인마다 방법론 면에서 약간의 차이는 있더라도, 개발 공부를 오래 하다 보면 저 방식에 수렴하게 되더라구요.

저는 상향식/하향식 공부를 섞어서 하는 것을 선호해서 나열된 순서를 지키지는 않습니다만... 저 세 항목을 자유롭게 오가는 식의 공부를 하고 있습니다! (위에서 언급했던 것처럼 공부는 가벼운 마음으로 임해야 오래 지속할 수 있으니까요)

 

오늘은 2번을 기준으로 삼아서 수업 시간에 배운 코드 중 일부를 정리해보겠습니다~

저는 AI 프레임워크의 꽃은 '자동 미분(Automatic Differentiation)'이라 생각합니다.

따라서 그 부분에 주안점을 두고 작성해 볼게요!

 

# Tensorflow (Automatic Differetiation)

Tensorflow에서는 GradientTape를 사용해서 미분 값을 계산할 수 있습니다.

물론 모든 Tensrflow 코드에 해당 기능을 사용하는 것은 아닙니다!

 

간단한 AI 코드는 Keras와 Tensorflow 사용만으로도 구현이 가능합니다.

+) 참고로 Keras는 Tensorflow와 별개로 존재하던 라이브러리였는데, Tensorflow 2.0으로 버전 업그레이드를 하면서 통합되었다고 하네요.

 

그러면 GradientTape 기능은 언제 주로 이용할까요?

음... 제 경험에 의하면 최신 논문 내용을 구현한 코드에서 주로 사용이 되었습니다.

식이 복잡해서 섬세한 미분 연산 제어가 필요한 곳에서 쓰이더라구요.

 

저는 이 기능을 DCGAN을 구현하면서 처음으로 봤습니다...^^

그 전까지 주로 Image Classfication을 했는데, 그때까지만 해도 GradientTape 기능을 딱히 볼 일이 없었어요.

그래서 처음 봤을 때 굉장히 당황했던 기억이 납니다. 

 

그럼 가볍게 예시를 통해 GradeientTape 기능을 보도록 할까요?

GradientTape는 필름과 비슷합니다.

필름에 영상 내역을 기록하면 뒤로 돌려 봄으로써 역추적이 가능합니다.

마찬가지로 Tensorflow의 GradientTape에도 수식 과정을 입력하면 역추적을 함으로써 미분을 할 수 있는데요.

이것은 딥러닝의 순전파, 역전파 개념에 속합니다.

import tensorflow as tf

layer = tf.keras.layers.Dense(2, activation='relu')
x = tf.constant([[1., 2., 3.]])

with tf.GradientTape() as tape:
  # Forward pass
  y = layer(x)
  loss = tf.reduce_mean(y**2)

# Calculate gradients with respect to every trainable variable
grad = tape.gradient(loss, layer.trainable_variables)

for var, g in zip(layer.trainable_variables, grad):
  print(f'{var.name}, shape: {g.shape}') # dense_1/kernel:0, shape: (3, 2) 
                                         # dense_1/bias:0, shape: (2,)

 

이 코드에서는 2개 노드로 구성되어 있는 Dense 레이어를 한 층 사용합니다.

여기에 (1, 3)의 shape를 가진 x를 입력함으로써 y 값을 계산합니다.

 

위에서 구한 y값의 모든 요소를 대상으로 전체 평균을 구합니다.

이때 스칼라 값이 나오는데, 이것을 loss로 지정합니다.

 

이 과정을 GradientTape에 기록합니다.

GradientTape에 기록된 내용을 사용하면 역전파 개념의 자동미분을 사용함으로써, 미분값을 확인할 수 있습니다.

 

# Pytorch (Automatic Differetiation)

import torch

# Define the computational graph
x = torch.ones(5)  # input tensor
y = torch.zeros(3)  # expected output
w = torch.randn(5, 3, requires_grad=True)
b = torch.randn(3, requires_grad=True)
z = torch.matmul(x, w)+b
loss = torch.nn.functional.binary_cross_entropy_with_logits(z, y)

# Compute gradients
loss.backward()
print(w.grad)
print(b.grad)

 

Pytorch는 코드가 직관적인 편입니다.

이러한 특성 때문에 Tensorflow에 비해 Pytorch의 이용층이 더 두터운 것 같다는 생각이 드네요.

 

확실히 Tensorflow에 비해 수식 그래프 정의하는 법도 간단하고, 역전파를 사용하는 법도 훨씬 쉽습니다.

Tensorflow 파트에서 설명했던 것처럼 길게 설명하지 않아도 딱 보면 알겠지요?

 

최근 연구논문에서도 Pytorch를 사용해서 코드 구현을 많이 하고 있는 추세이므로 반드시 Pytorch를 알고 있어야 합니다.

그렇다고 해서 Tensorflow를 완전히 포기해도 된다는 뜻은 아닙니다!

Tensorflow는 AI 시장의 큰 손에 해당하는 Google이 주도하고 있는 프레임워크이기 때문에 앞으로도 계속 쓰일 겁니다.

최근 OpenAI가 빠르게 성장하면서 Google이 상대적으로 덜 주목받는 것처럼 보이지만... 여전히 AI 시장을 지탱하는 큰 손이라는 것을 절대 잊으면 안 된다구요~

 

 

● 개선

이번 주에는 플레이 데이터 센터에서 제공해 주는 모의 코딩 테스트에 참여했어요.

참고로 모의 코딩 테스트 문제로 '프로그래머스 : PCCE'를 제공해 주셨습니다.

난이도 자체는 어렵지 않았지만... 정처기를 급하게 준비하느라 3일 동안 3시간씩 잤기 때문에 제정신이 아니었어요.

 

그래서 마지막 10번 구현 문제를 날렸답니다... 흑흑

집 돌아오는 길에 전철에서 눈을 좀 붙이고, 도착 후에 깨끗하게 씻으니까 그제서야 풀 힘이 생기더라구요.

잠들기 전에 빠르게 풀어 봤습니다! 

+) 푼 문제는 GitHub에 push까지 완료...^^

 

# PCCE 10번 문제 (2024.07.25)

문제를 최대한 복기해 보자면 다음과 같습니다.

따라서 내용이 정확히 일치하는 것은 아닙니다!

양갱이는 수식을 특이한 방식으로 계산하려고 합니다.

원래 사칙연산이란 곱하기&나누기부터 처리한 후, 더하기&빼기를 하는 것이 일반적입니다.
양갱이는 원래 규칙을 무시하고 순서대로 계산하려 합니다.

예를 들어 3 + 2 * 5 - 10이라는 수식이 있다면 원래 답은 3이 될 겁니다.
근데 양갱이는 이 수식을 순서대로 계산했기 때문에 15라는 값을 얻었습니다.

양갱이가 계산한 수식을 Python 코드로 나타내 보실래요?
+) 양갱이는 수식을 구성할 때에 피연산자는 양수만 사용하였으며, 연산자는 덧셈/곱셈/뺄셈만 사용했습니다.

 

from typing import List, Tuple

# Parsing numbers and operators
def num_op_parsing(input_str: str)-> Tuple[List[int], List[str]]:
    op_li = []
    temp_str_li = list(input_str)
    
    for i in range(len(input_str)):
        # Finding operators
        if not input_str[i].isdigit():
            temp_str_li[i] = ' '
            op_li.append(input_str[i])
            
    # Parsing numbers
    num_li = list(map(int, ''.join(temp_str_li).split()))
    return (num_li, op_li)

def solution(input_str: str) -> int:
    answer = 0
    num_li, op_li = num_op_parsing(input_str)
    
    answer += num_li[0]
    for i in range(1, len(num_li)):
        op = op_li[i-1]
        if op == '+':
            answer += num_li[i]
        elif op == '-':
            answer -= num_li[i]
        else:
            answer *= num_li[i]
    return answer

# input example : '3+2*5-10' (-> output: 15)
print(solution(input()))

 

제가 작성한 코드는 위와 같습니다.

문자열을 얼마나 잘 처리할 수 있는지, 자료형을 얼마나 잘 이해하고 있는지 묻는 문제라는 생각이 들었어요.

 

이제 슬슬 코딩테스트에 지금보다 더 밀도 있게 집중을 해봐야겠습니다!

컨디션이 좋지 않은 상황에서도 잘 풀 수 있는 사람이 되고 싶거든요...^^

 

그리고 PCCE에 대해 온라인에서 평이 많이 나뉘는 것 같은데, 모의 코딩 테스트 환경을 연습해 보는 용도로는 괜찮다는 생각이 들었습니다. 

 

확실히 중압감부터 다르긴 해요. 

감독관님들도 계속 체크하시고, 문제 생기면 채팅도 보내주시고 하거든요.

 

자격증 관점에서의 PCCE 가치에 대해서는 아직 의문이 좀 드는 입장이지만, 모의 테스트용으로는 적절하다고 생각합니다!

 

 

자격증 필기 시험도 끝났으니까 이제 다시 원래 하던 공부로 돌아와야겠어요!

자격증 공부도 유익하다고 느끼긴 했지만, 깊이가 얕다는 생각이 들어서 아쉬웠거든요...

 

얼른 자고 일어나서 내일 분량의 공부를 이어나가야겠습니다 ^_^

아 맞다... 근데 생각해 보니까 내일 온라인 특강이 하나 더 있네요...!!

내일은 또 뭘 배울지 궁금해져요! 공부 컨텐츠 풍족해서 완전 럭키비키~🍀☘️

 

이번 한 주도 수고했어, 문영아~!! 다음 주도 홧팅!!!

 

● 7월 회고

이번 달에는 비가 정말 많이 왔던 걸로 기억해요...!

어떤 날은 아침 지하철까지 지연되어서 얼마나 걱정을 많이 했는지 몰라요.

그래도 포기하지 않은 덕분에 이번 달 all 출석을 달성할 수 있어서 정말 뿌듯합니다 :)

다음 달도 힘내봐야겠습니다!

 

 

+) 부족한 부분이 있으면 댓글로 말씀해 주세요! 겸허한 마음으로 더 공부하겠습니다.