Soft skills (9)

[딥러닝강의] GPU 와 딥러닝 소프트웨어

Deep Learning Frameworks (https://analyticsindiamag.com/evaluation-of-major-deep-learning-frameworks/)

CPU vs. GPU

 

왜 딥러닝에서 CPU 가 아닌 GPU 를 사용할까? GPU 의 원래 목적은 그래픽을 rendering 하는 것이다. GPU 를 만드는 회사는 크게 NVIDIA 와 AMD 로 나뉜다. 여러 커뮤니티에서 NVIDIA 와 AMD 중에 무엇이 더 나은지 논쟁을 한다. 하지만 딥러닝 측면에서는 NVIDIA 의 GPU 가 더욱 좋다. AMD GPU 는 딥러닝 목적으로 사용하기 힘들다. 따라서 딥러닝에서 GPU 를 말하면 대부분 하나의 회사 NVIDIA 의 GPU 를 의미한다. 

 

Rendering 이란?

평면인 그림에 형태·위치·조명 등 외부의 정보에 따라 다르게 나타나는 그림자 색상 농도 등을 고려하면서 실감나는 3차원 화상을 만들어내는 과정 또는 그러한 기법을 일컫는다. 즉, 평면적으로 보이는 물체에 그림자나 농도의 변화 등을 주어 입체감이 들게 함으로써 사실감을 추가하는 컴퓨터그래픽상의 과정이 곧 렌더링이다. [네이버 지식백과] 렌더링 [rendering] 

 

CPU 와 GPU 의 차이

CPU 와 GPU 의 차이

1) 코어의 종류와 숫자

 

CPU 는 GPU 보다 더 적은 코어를 갖고 있지만 각각의 코어가 GPU 보다 더 강력한 컴퓨팅 파워를 갖고 있다. 따라서 CPU 는 순차적인 작업 (Sequential task) 에 더 강점이 있다. 반면 GPU 는 CPU 보다 코어수는 많지만 각각의 코어가 GPU 보다 더 성능이 낮기 때문에 병렬적인 작업 (Paralell task) 에 더 강점이 있다. 현재 PC 에서 사용되는 CPU 의 코어는 보통 4~10개 정도이며 hyperthreading 기술을 통해 thread 를 2배 정도 늘릴 수 있다. 예를 들어 8 코어 16 threads CPU 의 경우, 병렬적으로 16개의 task 를 수행할 수 있다는 뜻이다. 반면, 예를 들어 NVIDIA 의 Tital XP GPU 의 경우 3840 코어를 갖고 있다. 또 최근 출시된 2080 TI 의 경우 4,352 개의 코어를 갖고 있다. threading 을 감안하더라도 CPU와 GPU 의 코어 수의 차이는 200 배 이상이다. 

 

2) 메모리

 

CPU 와 GPU 의 중요한 차이 중 하나는 바로 메모리를 어떻게 사용하는지에 관한 것이다. CPU 는 캐시 메모리가 있지만 대부분의 시스템과 공유된 메모리를 사용한다. PC 의 경우 8GB, 16GB RAM 이 일반적인 메모리의 종류이다. GPU 의 경우 시스템과 메모리를 공유할 수도 있지, 이 경우 GPU 와 메모리 사이의 Bottleneck 이 생기기 때문에 성능이 낮아진다. 따라서 GPU 는 GPU card 내에 자체의 메모리가 존재한다. 예를 들어 Tital XP GPU 의 경우 12 GB 의 메모리를 갖고 있다. 

 

CPU 의 강점은 갖는 것은 여러가지 일 (음악 감상, 영화 감상, 딥러닝, 게임 등)을 할 수 있으며, 순차적인 처리를 빠르게 할 수 있다는 것이다. 반면, GPU 는 여러가지 일을 다 잘하진 못해도 병렬화를 할 수 있다면, 이를 빠르게 처리할 수 있다. 병렬화 가능한 일 중 하나가 바로 행렬 곱 (Matrix multiplication) 이다. 

 

병렬화 가능한 행렬곱

행과 열의 곱을 각각의 GPU 코어에서 처리 후 이를 합친다면 순차적으로 처리하는 것보다 더 빠르게 수행할 수 있을 것이다. GPU 를 이용한 프로그래밍을 하는 방법은 NVIDIA 의 CUDA 라이브러리를 사용하는 것이다. CUDA 를 이용하면 C, C++ 등의 언어로 GPU 프로그래밍을 할 수 있다. 또한 CUDA 보다 high-level API 로 cuBLAS, cuDNN 등 이 있다. high-level API 의 경우 CUDA 를 기반으로 행렬 연산, 딥러닝 등을 구현하는 것에 초점을 맞추어져 있기 때문에 이러한 작업들에 GPU 를 더욱 쉽게 이용할 수 있다. 하지만 CUDA 를 사용한 프로그래밍은 구현하기가 쉽지 않다. 예를 들어 캐시 메모리와 같은 메모리 계층 구조를 잘 이용하지 않으면 효율적인 코드를 작성하기 어렵다. 

 

따라서 딥러닝을 위해서 CUDA 코드를 처음부터 작성해서 이용하지 않는다. 먼저 NVIDIA 에서 CUDA 를 활용하기 위한 high-level API (cuDNN) 를 만들어 놓았기 때문에 이를 이용하면 되기 때문이고, 또한 cuDNN 을 활용한 다양한 딥러닝 프레임워크들이 이미 나와있기 때문이다. 

 

딥러닝 프레임워크

이름 단체
Caffe2 Facebook
PyTorch Facebook
TensorFlow Google
CNTK Microsoft
Paddle Baidu
MXNet Amazon

최근 딥러닝 프레임워크는 빠르게 생겨나고 있다. Tensorflow (Keras) 와 PyTorch 가 최근 가장 많이 사용되는 딥러닝 라이브러리가 볼 수 있다. 최근 MXNet 기반 Computer Vision toolkit 인 GluonCV 도 ICCV 에서 발표되는 등 많은 발전이 있는듯하다. GluonCV 는 컴퓨터 비전 분야의 State-of-the-art 를 사용하기 쉽게 만든 MXnet 의 high-level 라이브러리로 볼 수 있다. 

 

딥러닝 프레임워크를 사용하면 우리는 딥러닝을 효율적으로 구현할 수 있다. 상세하게는 아래와 같은 장점이 있다. 

 

1) 딥러닝 모델을 쉽게 만들 수 있다

2) Gradient 를 빠르게 구할 수 있다.

3) GPU 이용을 쉽게하고 효율적으로 동작할 수 있다 (cuDNN, cuBLAS 를 wrapping 해서 구현 → 효율 좋음). 

 


파이토치 (Pytorch)

 

파이토치 (https://pytorch.org/) 도 위와 같은 이유로 사용되는 대표적인 딥러닝 프레임워크 중 하나이며 최근 많은 인기를 얻고 있다. 파이토치가 인기를 얻게 된 이유는 기술을 단순화 시켜서 사용하도록 만든 사용 편리성과 함께, '동적 계산 그래프 (Dynamic computational graph)' 를 사용한다는 점이다. 텐서플로우의 경우 정적 계산 그래프 (Static computational graph) 으로 한 번 모델을 만든 후, 여러번 돌리는 방식인 반면, 동적 계산 그래프트는 한 번의 forward path 마다 새로운 그래프를 다시 그린다. 

 

cs231n lecture 8. Deep Learning Software

 

동적 계산 그래프 (Dynamic computational graph)

 

동적 계산 그래프는 어떤 장점을 가질까? 동적 계산 그래프는 복잡한 아키텍쳐를 구축할 때 더욱 유연하다. 예를 들어, RNN 을 활용한 Image captioning 의 경우 input 에 따라 output sequence (텍스트) 의 길이가 달라진다. 따라서 computational graph 가 input 이미지에 따라 동적으로 변한다는 것이다. 이 경우 forward path 마다 구조가 바뀌는 것이 더 효율적이므로 동적 계산 그래프가 더욱 적합하다. 

 

image captioning (https://towardsdatascience.com/image-captioning-in-deep-learning-9cd23fb4d8d2)

이와 비슷한 Visual Question Answering (VQS) 분야에 Neuromodule 도 동적 계산 그래프가 적합한 예이다. Neuromodule 은 "이미지" 와 "질문" 두 가지를 입력하면 답변을 위한 custom architecture 를 만들고 답을 출력하고자 하는 모델이다. 예를 들어, 고양이 사진을 주고 "고양이의 색깔은?" 과 같은 질문을 던지는 것이다. 이 경우에도 마찬가지로 네트워크가 동적으로 구성되어야 할 것이다. 어떤 사진을 주고 "이 이미지에서 고양이의 수가 강아지의 수보다 많은가?" 라는 질문을 던지면 앞선 네트워크와는 다르게 구성되어야 한다. 이처럼 동적 계산 그래프를 활용하면 다양한 네트워크를 구성할 수 있다. 

 

파이토치는 연구를 위한 목적으로 만들어진 라이브러리이다. 그래서 요청에 따라 빠르게 응답해야하는 프로덕트 용으로는 적합하지 않을 수 있다. 하지만 Open Neural Network Exchange (https://onnx.ai/) 라는 새로운 프로젝트가 나오면서 이런 제약이 줄어들고 있다. onnx 는 머신러닝 모델의 interoperability 를 위한 프로젝트로 모델을 ONNX Format 로 export 한 후 다른 환경에서 import 할 수 있도록 한다. 이를 활용하면 파이토치 모델을 프로덕션용 Caffe2 모델로 변환해서 배포할 수 있다. ONNX Format 은 파이토치 외에도 CNTK, MXNet, 텐서플로, 케라스, Scikit-Learn 에도 활용할 수 있다. 

 

파이토치의 설치

 

환경 : Ubuntu 16.04, Jupyter Lab (with JupyterHub), Python 3.8, Cuda 

 

1) 파이썬 가상 환경 (virtual environment) 생성 & Jupyter Lab 등록

 

 

conda create --name pytorch python==3.8
source activate pytorch
pip install ipykernel
python -m ipykernel install --name pytorch

 

2) CUDA version check 

 

nvcc --version 


nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2017 NVIDIA Corporation
Built on Fri_Sep__1_21:08:03_CDT_2017
Cuda compilation tools, release 9.0, V9.0.176

 

3) Install Pytorch 

 

pytorch 홈페이지에서 환경을 클릭하면 설치할 수 있는 커맨드를 출력해준다. CUDA 9.0 을 사용하고 있는데, CUDA 9.2 를 선택해서 나온 커맨드로 설치해도 무방한듯 하다. 

 

https://pytorch.org/

 

conda install pytorch torchvision cudatoolkit=9.2 -c pytorch

 

설치 완료 후 주피터 랩에서 pytorch kernel 을 실행 후, import pytorch 로 임포트가 잘 되는 것을 확인하자. 

 

Reference

 

  • 박매 2021.02.25 09:22

    안녕하세요. 딥러닝에 관심 있는 학생입니다. 데이터 규모에 따라 gpu 사양도 달라질 것 같은데 예를 들어 데이터의 갯수가 10million (10,000,000개)라고 했을 때

    이를 처리하기 위한 gpu사양과 computational cost는 어떻게 되는 건지 여쭤봐도 될까요?

  • 별별 2021.08.17 17:38

    정말 좋은 내용입니다.
    와..


[딥러닝 강의] [1] 데이터 기반 이미지 분류 (Data-driven Image Classification)

이미지 분류 개요
이미지 분류는 컴퓨터 비전 분야의 주요 문제이다. 사람은 고양이를 보고 고양이라고 쉽게 분류할 수 있지만, 컴퓨터에게는 매우 어려운 문제이다. 사람은 고양이를 실체가 있는 물체로 인식하는 반면 컴퓨터에게는 0~255 사이의 숫자로 표현되기 때문이다. 이미지 분류의 문제는 이러한 사람과 컴퓨터의 사물을 보는 차이에서 온다. 예를 들어, 고양이를 관측한 위치 (viewpoint variation), 빛 (Illumination), 고양이의 자세 (deformation), 가림 (Occlusion), 고양이의 종류 (Intraclass variation) 등에 따라 컴퓨터에게 고양이는 상당히 다르게 인식된다. 단지 고양이 뿐만이 아니다. 여러 물체를 인식하고 이를 분류하는 문제는 매우 challenging 하다고 할 수 있다. 

그림. 사람과 컴퓨터의 이미지 인식 차이


딥러닝 이전 시대에 이미지를 분류하기 위하여 다양한 시도들이 있어왔다. 대표적으로 사진으로부터 고양이의 귀, 고양이의 눈, 고양이의 코가 '존재한다는 정보' 를 얻는 알고리즘을 만들고 이를 통해 고양이임을 판단하고자 한 방법이 시도되었다. 이를 규칙 기반 방법 (Rule-based approach) 하지만 이러한 방법의 문제는 1) 불안정하다는 것 (고양이의 귀, 코는 종에 따라 다르고, 자세와 위치에 따라 다르게 인식된다.) 과 2) 규칙을 만드는 것이 어렵다는 것이다. 예를 들어, 말해 고양이가 아니라 사진으로부터 개나 트럭을 분류해내고 싶으면 어떨까? 클래스마다 사람이 새로운 규칙을 만들어주어야한다. 즉 이러한 방법은 확장성 (scalability) 이 떨어진다. 

데이터 기반 방법
이러한 문제를 해결하기 위해 제시된 것이 데이터 기반 방법 (Data-driven approach) 이다. 데이터 기반 방법은 사람이 직접 알고리즘을 만드는 것이 아니라 데이터를 기반으로 모델을 만들어 문제를 해결하고자 하는 방법이다. 결론부터 말하면 이미지 분석에 있어 데이터 기반 방법은 규칙 기반 방법보다 거의 모든 측면에서 효과적이다. 또한 사람이 학습하는 방법과도 비슷하다. 

그림. Rule-based approach vs. Data-driven approach


데이터 기반 방법은 수많은 이미지와 레이블 (ex. 개, 고양이 등) 이 있는 데이터셋을 통해 모델을 학습 (training) 한다. 이 때, 모델을 학습하는 것을 머신 러닝 (Machine Learning) 이라고 말한다. 이렇게 학습된 머신러닝 모델은 새로운 이미지를 인풋으로 받아 그 이미지의 레이블을 예측 (prediction or test) 한다. 즉, 이미지를 분류하는 모델을 만드는 방법 중 데이터 기반 방법을 머신러닝이라고 하며, 머신러닝 모델은 데이터셋을 통해 이미지를 학습하는 과정과 새로운 이미지를 예측하는 과정이 있다. 머신러닝 모델의 학습을 위한 데이터셋은 직접 웹 등으로부터 수집할 수 있다. 또한 ImageNet, CIFAR 등 공개된 질 좋은 데이터셋도 있기 때문에 누구나 직접 머신러닝 모델을 구축해볼 수 있다. 예를 들어, CIFAR-10 데이터셋은 10개의 클래스, 50000개의 트레이닝셋, 10000개의 테스트셋으로 구성된다.  


그림. CIFAR-10 데이터셋


이미지 분류를 위한 첫 번째 알고리즘 : Nearest neighbor

데이터 기반 모델의 첫 번째 간단한 예시로 nearest neighbor (NN) 방법을 살펴보자. KNN 방법은 먼저 학습 데이터셋을 저장한 후에, 예측 단계에서는 투입된 이미지와 가장 가까운 데이터의 레이블을 통해 예측 하는 방법이다. 그러면 이미지와 이미지의 가까운 정도 (distance) 는 어떻게 구할 수 있을까? 다양한 지표 (metric) 이 있지만 그 중 한 가지인 L1 distance 는 다음과 같다.


$$ d_1 (I_1, I_2) = \sum_{p} | I_1^p - I_2^p | $$


L1 distance 를 distance metric 으로 사용하는 nearest neighbor 을 파이썬 코드로 아래처럼 구현할 수 있다. 


import numpy as np

class NearestNeighbor(object):
  def __init__(self):
    pass

  def train(self, X, y):
    """ X is N x D where each row is an example. Y is 1-dimension of size N """
    # the nearest neighbor classifier simply remembers all the training data
    self.Xtr = X
    self.ytr = y

  def predict(self, X):
    """ X is N x D where each row is an example we wish to predict label for """
    num_test = X.shape[0]
    # lets make sure that the output type matches the input type
    Ypred = np.zeros(num_test, dtype = self.ytr.dtype)

    # loop over all test rows
    for i in xrange(num_test):
      # find the nearest training image to the i'th test image
      # using the L1 distance (sum of absolute value differences)
      distances = np.sum(np.abs(self.Xtr - X[i,:]), axis = 1)
      min_index = np.argmin(distances) # get the index with smallest distance
      Ypred[i] = self.ytr[min_index] # predict the label of the nearest example

    return Ypred


위 코드를 사용해서 테스트셋에 대한 성능을 평가한 결과 38.6 % 정도의 성능을 보인다. 우선, 임의로 찍은 수치 (10 %) 보다 성능이 좋기 때문에 모델을 만드는데 큰 노력을 들이지 않았다는 점을 감안해 괜찮은 수치이다. 하지만 state-of-the-art 인 Convolutional Neural Network 기반 모델의 성능 (95 %) 과 비교하면 매우 낮다. 


L1 외에도 다양한 metric 을 쓸 수 있다. 예를 들어, L2 distance 는 다음과 같다.


$$ d_2 (I_1, I_2) = \sqrt{\sum_{p} ( I_1^p - I_2^p )^2} $$



L1 L2 distance 의 차이

L1 과 L2 는 p-norm 계열의 distance measure 이다. 그러면 L1 과 L2  의 차이는 L2 distance 는 L1 distance 를 사용하는 것보다 차이가 큰 것에 더 관대하지 않다는 것이다. 즉, L1 이 아닌 L2 distance 를 쓴다는 것은 여러개의 dimension 에서 적당한 차이를 보이는 것보다 하나의 dimension 에서 큰 차이를 보이는것에 더 페널티를 많이준다는 의미다. 


K-nearest neighbor 

nearest neighbor (NN) 은 단점이 많은 알고리즘이다. 먼저, NN 은 단 하나의 label 만 prediction 에서 고려하기 때문에 안정성이 떨어지는 결과를 보여준다. 한 마디로 성능이 떨어진다. 이를 보완하기 위해 k-nearest neighbor (KNN) 를 활용할 수 있다. 이 방법은 테스트 (또는 예측) 단계에서 인풋과 가까운 순으로 총 k 개의 데이터의 레이블을 구한 후, 가장 빈번하게 나오는 레이블로 예측하는 방법이다. 이렇게 여러개로부터 가장 빈번하게 나오는 것을 예측 결과로 하는 것을 머신러닝에서는 voting 이라고 부른다. 


그림.  k-nearest neighbor


위 그림을 보면 NN 대신에 K-nearest neighbor 을 사용하면 어떤 장점이 있는지 확인할 수 있다. NN 에는 이상치 (outlier) 를 중심으로 섬과 같은 지역 (decision boundary) 가 생긴다는 것을 볼 수 있다. 하지만 KNN 의 경우, 이상치에 더 둔감하다. NN 의 경우 이상치에 민감하기 때문에 트레이닝 데이터에 국한된 규칙을 배울 가능성이 높다. KNN 을 사용하면 처음 보는 데이터 (unseen data) 대한 성능 (generalization)이 높을 것임을 짐작할 수 있다. 그리고 처음 보는 데이터를 올바르게 예측하는 것이 머신러닝 방법을 사용한 예측 모델링의 주요 목적이다. K-nearest neighbor 를 실제로 사용할 때  한가지 고려 사항은 k 를 어떻게 정하냐는 것이다. k 가 높으면 물론 좋겠지만 그만큼 테스트 단계에서의 계산량이 매우 많아진다는 단점이 있다. 


Validation set 을 통한 Hyperparameter tuning

K-nearest neighbor 에서 우리가 정해야할 것은 kdistance function 이다. 이를 알고리즘 자체의 파라미터, hyperparameter 라고 한다. 그리고 이를 조정하는 방법을 hyperparameter tuning 이라고 한다. 머신러닝에서 hyperparameter tuning 을 하는 주 방법은 여러번 해봐서 가장 좋은것을 찾는 것이다. 이것은 별다른 아이디가 없을 때 좋은 방법이다. 하지만 hyperparameter 를 찾는데 테스트셋을 사용할 수는 없다. 머신러닝에서 테스트셋은 성능을 평가하는 것 이외에 다른 목적으로 쓰일 수 없다. 만약 테스트셋으로 hyperparameter tuning을 하면 모델이 테스트셋에 과적합 (overfitting) 되며, 다른 처음보는 데이터에 적용했을 때 상당히 성능이 떨어지는 문제를 겪게 된다. 테스트셋은 반드시 모델 구축이 끝난 후, 단 한 번 평가 되어야 한다.  따라서 방법은 트레이닝 셋의 일부를  hyperparameter tuning 을 위하여 분할하여 사용하는 것이다. 이를 validation set 이라고 부른다. validation set 을 통한 hyperparameter tuning 은 머신러닝에서 중요한 개념 중 하나이다. Validation set 을 통한 Hyperparameter tuning 을 아래와 같은 파이썬 코드로 구현해볼 수 있다. 


# assume we have Xtr_rows, Ytr, Xte_rows, Yte as before
# recall Xtr_rows is 50,000 x 3072 matrix
Xval_rows = Xtr_rows[:1000, :] # take first 1000 for validation
Yval = Ytr[:1000]
Xtr_rows = Xtr_rows[1000:, :] # keep last 49,000 for train
Ytr = Ytr[1000:]

# find hyperparameters that work best on the validation set
validation_accuracies = []
for k in [1, 3, 5, 10, 20, 50, 100]:
  
  # use a particular value of k and evaluation on validation data
  nn = NearestNeighbor()
  nn.train(Xtr_rows, Ytr)
  # here we assume a modified NearestNeighbor class that can take a k as input
  Yval_predict = nn.predict(Xval_rows, k = k)
  acc = np.mean(Yval_predict == Yval)
  print 'accuracy: %f' % (acc,)

  # keep track of what works on the validation set
  validation_accuracies.append((k, acc))


Nearest neighbor  잘 작동할까?


nearest neighbor 은 매우 이해하기 쉬운 알고리즘인 반면 여러 단점이 존재한다. 


1) 현실적인 단점은 NN은 테스트 단계에서 시간이 오래걸린다는 것이다. 모든 n 개의 트레이닝 데이터에 대해서 distance 를 구해야하기 때문에 O(n) 의 복잡성을 갖는다. 따라서 현실의 어플리케이션에 적용하기는 매우 어렵다. (NN 의 테스트 단계에서의 계산 복잡성을 줄이기 위해 Approximate Nearest Neighbor (ANN) 도 연구가 활발히 이루어지고 있는 분야이다. ANN 을 구현한 FLANN 라는 것도 있다. 기본 아이디어는 kdtree 나 k-means 알고리즘 등을 통해 데이터 인덱싱을 먼저 수행하여 테스트 단계에서 조회할 데이터를 줄이는 것이다.) 


2) NN 우리의 물체의 유사성에 대한 인식 (perceptual similarity) 과 부합하지 않는 결과를 내놓을 수 있다. 아래 그림은 모두 original 데이터와 L2 distance 를 기준으로 같은 유사성을 보이도록 이미지를 변환한 것이다 예를 들어 우리가 original 과 shifted 이미지를 인식할 때, 피사체의 위치에 차이만 있을 뿐 물체에는 아무런 차이가 없다. 하지만 단지 물체가 옆으로 이동한 것만으로도 상당한 distance 가 생기게 된다는 것이다. 


그림. 원본 이미지와  같은 L2 distance 를 갖는 이미지 모음


Raw-pixel 을 이용한 모델은 왜 실패하는가?


왜 이런 문제가 생길까? 문제는 물체의 특성이 아닌 각 픽셀을 기준으로 차이를 비교한다는 것이다. 물론 픽셀이 이미지의 특성을 반영하지만, 픽셀 값의 많은 부분이 물체 인식과 크게 관련이 없다. 아래 그림은 CIFAR-10 데이터셋에 t-SNE 를 적용해 이미지를 2차원으로 표현한 것이다. 이렇게 고차원을 저차원으로 바꾸는 것을 dimension reduction 또는 embedding 이라고도 부른다.  고차원 데이터를 공간상에 표현하는 것이 힘들기 때문에 이와 같이 저차원으로 바꾸어 표현하고자 한 것이다. 이상적으로는 CIFAR의 10개의 클래스에 맞게 군집화 되어야한다. 하지만 그림을 자세히 살펴보면 물체에 인식과 관련있는 특성 뿐 아니라 배경, 또는 색깔 등에 큰 영향을 받는다는 것을 알 수 있다. 즉, 픽셀은 물체에 대한 인식 뿐 아니라 불필요한 것까지 표현한다. 따라서 raw-pixel 을 기준으로 nearest neighbor 을 적용 하는 것은 적절하지 않은 방법이다. 단지, nearest neighbor 뿐 아니라 raw-pixel 을 output 으로 direct mapping 하는 대부분의 머신러닝 알고리즘은 같은 이유로 이미지 데이터에 효과적으로 적용되기 어렵다. 어떻게 이미지를 '우리의 인식과 관련 있는 특성' 으로 요약할 수 있을지에 관한 것이 representation learning 이며, 이것은 딥러닝 (deep learning) 의 핵심 아이디어이다.  


그림. CIFAR-10 의 tSNE를 통한 2차원 임베딩


Summary

  • 데이터 기반 이미지 분류의 기본 개념 1) 이미지-레이블 데이터셋을 통해 모델 학습 2) 새로운 데이터에 대해 예측
  • Nearest Neighbor 을 통해 이미지 분류 하는법 + Validation set 을 통해 hyperparameter tuning 하는 방법  
  • training, validation, test set 의 개념. test set 은 모든 프로세스에서 반드시 한 번만 사용되어야 한다.
  • Raw-pixel 에 을 output 으로 direct mapping 해서 모델을 만드는 것이 실패하는 이유 (인식과 표현의 차이)

참고


  • 기적 2021.01.27 14:44 신고

    정성스런 강의 감사합니다..

[지데넓얕] 하둡과 맵리듀스 스파크의 관계  


하둡 (Hadoop)


https://www.ibmbigdatahub.com/blog/what-hadoop



"하둡은 간단한 프로그래밍 인터페이스를 통해 클러스터 환경에서 대용량 데이터에 대한 분산 처리를 하는 소프트웨어 라이브러리다.


하둡의 정식명칭은 아파치 하둡 (Apache Hadoop) 이며 scalable, distributed computing 을 위한 소프트웨어 플랫폼입니다. 하둡은 오픈 소스 프로젝트이고 아파치 재단에 의해 관리됩니다. 하둡은 "데이터를 읽고 처리하는 속도가 데이터의 양을 따라잡지 못한다" 라는 문제에서 출발했습니다. 하드디스크 입출력 속도는 보통 100MB/s 정도입니다. 하지만 기업환경에서 마주하는 데이터는 최소 기가바이트 (GB) 에서 테라바이트(TB), 페타바이트 (PB) 까지 이르는 경우가 많습니다.  하둡의 필요성을 생각해보기 위해 예를 들어 설명해보겠습니다. 아래의 상황에서 하둡이 유용할 수 있습니다. 


1) 하드 디스크는 1TB짜리 인데, 3TB 데이터를 저장하고 싶을 때

2) 100 개의 파일에 대해 똑같은 작업을 해서 결과를 합치는 분산 컴퓨팅을 하고자 할 때 

3) TB 단위 이상의 데이터를 빠르게 Disk I/O (로드 또는 저장) 하고 싶을 때 


하둡의 두 가지 키워드는 scalable distributed computing 입니다. scalable 은 확장 가능하다는 뜻으로 자원을 추가하더라도 코드의 수정 등을 할 필요 없이 동일한 방법으로 프로세싱을 할 수 있다는 의미입니다. distributed computing 은 분산 컴퓨팅을 의미하여 Job 을 적절한 크기로 쪼갠 후, 분산된 자원원을 통해 계산하고 결과를 합치는 작업을 말합니다. 



맵 리듀스 (Map-Reduce)



A BIG DATA PROCESSING FRAMEWORK BASED ON MAPREDUCE WITH APPLICATION TO INTERNET OF THINGS (2016)


"맵 리듀스는 아파치 하둡 프로젝트의 서브 프로젝트로, 분산 컴퓨팅을 위한 프레임워크다. "


하둡의 맵리듀스는 distributed computing 을 위한 프레임워크입니다. 맵리듀스는 하둡의 서브 프로젝트라고 볼 수 있습니다. 맵리듀스는 Job 의 스케쥴링, 모니터링, 에러 핸들링 등을 수행합니다. 맵 리듀스는 인풋 데이터를 독립적인 청크로 나누고 이를 병렬적으로 처리합니다. 맵리듀스는 하둡 파일 시스템 HDFS (Hadoop Distributed File System) 으로부터 데이터를 불러오고 저장할 수 있습니다. 맵 리듀스의 이해를 위해 다음과 같은 예를 들어봅시다. 


ex) 100개의 문서가 있고, 그 문서에서 단어의 빈도수 예를 들면, 'dog', 'cat', 'bird', 'fish', ... 의 수를 세서 결과를 보여주는 프로그램을 작성하라. 100개 이상의 컴퓨터를 보유하고 있다. 문서의 크기가 다 다르고 메모리 문제로 한 컴퓨터에서는 평균 1개의 문서만 로드할 수 있다. 


간단하게 생각해보면 100개의 컴퓨터에 각각 1개의 문서를 할당해 단어 빈도수를 세고, 이를 합치면 되겠죠. 이것도 분산 컴퓨팅의 일종입니다. 하지만 이것은 그렇게 간단한 문제는 아닙니다. 예를 들어, 실행 도중 몇몇 컴퓨터에서 갑자기 오류가 날 수 있습니다. 또 각각의 컴퓨터에서 계산한 단어 빈도수를 한 컴퓨터에서 합산해서 보여주고자 할 때, 컴퓨팅 자원의 문제로 합산이 불가능할 수 있습니다. 또한 각 문서의 크기가 달라 한 컴퓨터당 하나의 문서를 할당하는 것이 비효율적일 수도 있습니다. 즉, 다양한 상황을 고려한 하나의 분산 컴퓨팅 프레임워크가 필요합니다. 


https://stackoverflow.com/questions/47531863/why-key-is-not-unique-in-mapreduce-function



맵 리듀스는 '분산 컴퓨팅을 실제로 어떻게 할 것인가?' 에 대한 잘 알려진 답변입니다. 맵 리듀스는 크게 리듀스로 나뉩니다. 맵에서 인풋데이터는 "키-값 쌍" 으로 변화되고, 스플릿 단위로로 나뉘어서 각 노드에 할당됩니다. 맵은 리듀스를 위한 키-값쌍을 만들어냅니다. 이 때, 키-값쌍은 사용자에 의해 정의될 수 있습니다. 리듀스 태크스는 맵의 아웃풋 키-값 쌍을 인풋으로 받아 최종 결과를 출력합니다. 예를 들어, 위 문제에서 인풋 데이터를 (문장의 오프셋, 문장 텍스트) 의 키-값 쌍으로 정의해볼 수 있습니다. 이렇게 인풋 데이터를 키-값 쌍으로 나누고 노드에 할당하는 것을 Splitting 이라고 합니다. Splitting 에서 인풋데이터는 입력 스플릿 (input split) 또는 단순히 스플릿이라고 부르는 고정된 크기의 조각으로 분리합니다. 문서 단위로 노드에 할당하는 것보다 스플릿 단위로 할당하는 것이 더욱 빠릅니다. 또한 한 컴퓨터에서 불가능했던 일을 가능하게 할 수 있습니다. 



스파크 (Spark)


https://dzone.com/articles/apache-spark-fast-big-data


"스파크는 하둡 위에서 동작할 수 있는 인메모리 프로세싱 엔진이다." 


위 맵 리듀스 절차는 통해 분산 컴퓨팅을 어떻게하는지 감을 잡으셨을 거라고 생각합니다. 하지만 실제로 이를 코드로 구현하는 것은 복잡합니다. 하둡 라이브러리의 객체를 상속 받아 메소드 오버라이딩을 하고 최종적으로 구현된 클래스를 모아 jar 형태로 만들어 배치형태로 하둡에 제출해야합니다. 즉, 하둡의 맵-리듀스는 ad-hoc 데이터 분석에 적합하지 않습니다. 따라서 맵-리듀스를 보다 유저 친화적으로 할 수 있는 다양한 방법이 제시되었습니다. 그 중 하나가 스파크입니다. 


스파크의 기본적인 특성

  • 스파크는 분산 인메모리 프로세싱 엔진입니다. 스파크는 반드시 하둡과 같이 사용될 필요는 없습니다. 하지만 스파크는 하둡을 지원합니다. 예를 들면 스파크는 하둡이 사용하는 파일 시스템인 HDFS (Hadoop Distributed File System) 의 데이터를 읽어올 수도 있고, 반대로 데이터를 쓸 수도 있습니다. 
  • 스파크는 HDFS 에 저장된 데이터를 하둡 코어 라이브러리를 호출함으로써 메모리로 불러온 후, 변환 및 계산 등을 거쳐 최종 원하는 결과물을 산출합니다. 스파크는 인메모리 프로세싱을 하기 때문에 Disk I/O 가 많이 일어나는 하둡의 맵-리듀스보다 특정 작업 (ex. multi-pass map reduce)에서는 더 빠르게 수행될 수 있습니다. 
  • 스파크는 여러가지의 분산 데이터베이스나 파일 시스템을 수용할 수 있습니다. 하둡 뿐만 아니라 카산드라를 사용을 할 수도 있습니다. 카산드라는 CQL (Cassandra Query Language) 이라는 고유의 SQL 문법이 있는데, 이는 SQL 의 서브셋으로 다양한 데이터 추출을 이용하기가 힘들다고 알려져 있습니다. 카산드라에 스파크를 결합해 추가적인 데이터 프로세싱을 사용할 수 있기 때문에 카산드라 자체만을 통해 못하는 일을 할 수 있습니다.
  • 스파크의 한 가지 장점은 stream processing 이라고 하는 실시간 데이터처리 입니다. 스파크는 실시간 데이터 처리를 위해 세팅이 될 수 있고, micro-batches 단위로 데이터 프로세싱을 수행할 수 있으며, 결과를 하둡 HDFS, 카산드라 같은 파일 시스템에 저장할 수 있습니다. 


스파크의 아키텍쳐


https://towardsdatascience.com/getting-started-with-apache-spark-ad9d59e71f6f


스파크의 주요 개념은 Resilient Distributed Datasets (RDD) 와 directed acyclic graph (DAG) execution engine 입니다. RDD 는 스파크에서 사용되는 데이터셋으로 각 단어는 다음과 같은 뜻이 있습니다. 

  • Resilient: 분산되어 있는 데이터에 에러가 생겨도 복구할 수 있는 능력
  • Distributed: 클러스터의 여러 노드에 데이터를 분산에서 저장 
  • Dataset: 분산된 데이터의 모음 


스파크에서 RDD 에 대해 수행할 수 있는 연산은 크게 1) transfomation 2) action 으로 나눌 수 있습니다. transformation 은 인풋데이터로부터 새로운 데이터셋을 만들어내는 것이고 (ex. map, filter), action 데이터셋으로부터 계산 (ex. reduce or count)을 하는 것입니다. 스파크에서는 DAG engine 을 통해 맵리듀스의 느린 부분 (multi-pass map reduce, multi-stage execution model)을 제거해 상당한 성능 향상도 가능합니다. 


RDD 를 통한 분석 워크 플로우는 다음과 같이 요약해볼 수 있습니다.



https://www.edureka.co/blog/spark-architecture/#Overview


Reference


[지데넓얕] Data Science와 Data Engineering 은 무엇이 다를까?


2020년 부터 블로그 포스팅 컨텐츠의 일환으로 "지적 데이터과학을 위한 넓고 얕은 지식 (지데넓얕)" 을 진행해볼까 합니다. 제목은 많이 알려진 책인 지적대화를 위한 넓고 얕은 지식 (채사장) 을 패러디한 것이며, 목적은 데이터과학 관련 지식을 전문적으로 다루기 보다는 상식 수준에서 쉽게 다루어보는 것입니다! 첫번째 포스팅으로는 Data science 와 Data engineering 의 차이점에 대해서 정리해보겠습니다. 


Data Science


Data Science 는 이름에서도 알 수 있듯, Data + Science 이다. '데이터' 를 통해 '과학' 을 하는 것입니다. 사실 Data science란 용어는 매우 모호한 단어입니다. 전통적인 연구 (Traditional research) 에서도 데이터를 통해 과학을 하는데 이와 무엇이 다르냐고 할 수 있습니다. 또한 오래전부터 있어왔던 개념인 정보학 (Informatics) 과는 무엇이 다른 것일까요? 이러한 단어의 모호함 때문에 Data science 라는 이름만 보고는 무엇을 하는 건지 명확히 아는데 어려움을 겪습니다.




데이터과학은 구체적으로 '도메인 빅데이터'에 '통계' 와 'IT 기술'을 접목시켜 과학을 하는 것입니다. 이는 위그림에 잘 표현되어 있습니다. 데이터과학에는 3가지 구성 요소가 있습니다. 1) Computer science 2) Statistics 3) Domain knowledge 입니다. 과학이란 새로운 사실을 발견하는 것입니다. 사전적 정의에 따르면 과학은 "검증된 방법으로 얻어 낸 자연계에 관한 체계적 지식 체계" 이지만, 자연계이외에도 포괄적으로 빅데이터에 통계, IT 기술을 접목시켜 Business insight 도출, 의사 결정을 하는 것도 데이터과학이라고 부릅니다. 즉, 과학이라는 것은 데이터과학에서 폭넓은 의미로 쓰이며, '도메인 빅데이터'에 '통계' 와 'IT 기술'을 접목해 문제를 해결하는 것 정도로 데이터 과학을 요약할 수 있습니다. 


데이터 과학자 (Data scientist) 는 크게 두 가지 종류가 있다고 생각합니다. 첫 번째는 머신러닝 전문가로서, 여러 도메인의 문제 해결에 도움을 주는 데이터 과학자 입니다 (Machine learning engineer or scientist). 즉, 위 그림에서 Machine learning 에 중점을 두면서 여러 도메인의 문제를 푸는 사람입니다. 이 경우 머신러닝의 최신 동향 파악 및 최신 기술 (State-of-the-art) 의 활용에 강점이 있습니다. 두 번째는 특정 도메인에 국한해 빅데이터에 IT 와  통계 지식을 접목해 문제를 해결하는 사람 (Domain expert) 입니다. 위 그림에서 Domain knowledge 에 폭넓은 이해와 함께 필요한 IT 기술, 통계학적 지식을 접목해 문제를 해결하는 사람입니다. 이 경우 도메인 지식을 활용한 Feature 선정, 공학도메인에서 문제를 스스로 찾고 이를 공학적으로 formulation 하는 능력에 강점이 있습니다. 


Data Engineering


위 데이터 과학의 정의를 보면 데이터과학자들의 역할이 매우 광범위합니다. 데이터 공학 (Data engineering) 은 대규모의 데이터를 효율적으로 관리하고 처리하며 가공을 통해 분석에 적합한 형태 or 데이터과학자가 사용할 수 있는 형태로 만드는 것과 관련이 있습니다. 큰 회사의 경우 데이터의 크기가 매우 크고, 이를 저장하기 위하여 분산 시스템을 활용하며, Database management system, text file 에 데이터를 저장합니다. 이러한 데이터 저장 시스템에 데이터를 저장하고 필요할 때 추출해서 처리하기 위한 방법론을 데이터 공학이라고 이야기합니다. 데이터 과학자와 데이터 공학자는 카레이서와 카트를 만드는 사람으로 비유할 수 있습니다. 카레이서는 카트가 없다면 달릴 수 없듯, 빅데이터 분석에서 데이터공학자 없이 데이터 과학자가 존재하기 힘듭니다. 하지만 데이터 공학자는 실제 데이터과학 접목을 통해 Product 를 만들었을 때, 덜 주목 받을 수 있습니다. 왜냐하면 전체 Product 개발의 pipeline 을 봤을 때, 초기 단계에 있는 일을 하기 때문입니다. 데이터 공학은 빅데이터 처리 시스템이 갖추어지지 않은 작은 규모의 기관에서는 그 역할이 축소될 수 있고, 데이터과학자가 겸임을 하기도 합니다.  


https://www.elderresearch.com/consulting-services/data-engineering


위 그림은 대규묘 데이터 활용의 파이프라인에서 Data engineering 이 담당하는 역할을 잘보여줍니다. 데이터 공학자는 비지니스 데이터를 분산 시스템에 정형화된 형태로 저장 (위 그림의 Immutable data store) 하고 필요할 때, 이를 Extract, Load, Transform (ETL) 해서 분석에 적합한 형태 (위 그림의 Analytic base table) 로 만듭니다. 데이터 과학자는 이 데이터를 통해 데이터 과학을 합니다. 


데이터 과학과 데이터 공학의 공통점과 차이점은 아래와 같이 요약을 해볼 수 있습니다. 


공통점

데이터과학 

데이터공학 

소프트웨어 기술 

빅데이터

통계학

머신러닝

도메인지식

빅데이터 Infrastructure 

분산처리 기술 (Hadoop, Spark)

분산시스템 데이터처리 Pipeline 

실시간 처리 시스템



효율적으로 이메일을 쓰는 8가지 팁


학교에서 이메일을 쓰는 법을 알려주지는 않는다. 하지만 업무 환경에서 이메일을 잘쓰는 것은 매우 중요한 스킬 중의 하나이다. 특히, 대학원생과 같은 재택 근무를 하는 직업에 있어서는 이메일이 전적인 커뮤니케이션 수단일 수도 있으며,  교수와 컨택을 하거나, 회사에 지원하는 상황에서 이메일은 그 사람의 첫 인상을 결정지을 수 있다. 실제 업무에 있어서도 내용이 명확하지 않은 이메일은 혼란과 지연을 일으킬 수 있기 때문에 이메일을 효율적으로 쓰면 업무의 능률을 높일 수 있을 것이다. 본 포스팅에서는 어떻게 하면 효율적으로 이메일을 쓸 수 있을지 8가지로 정리해보고자 한다. 영어 이메일을 쓰는데 중점을 두고 정리했지만, 한국어로 이메일을 보낼 때도 마찬가지로 적용할 수 있는 내용이다. 


1. 머릿속으로 먼저 내용을 구상하기 / 수신자 입장에서 생각하기  


이메일을 쓰기 위하여 키보드에 손을 올리기 전, 먼저 전체 내용에 대해 구상하는 것이 좋다. 특히 다음과 같은 것을 먼저 생각해보면 좋다. 

  • 왜 이메일을 쓰는가?
  • 어떤 내용을 전달할 것인가?
  • 어떤 답을 원하는가?

만약 상대방에게 요청하는 종류의 이메일이라면 요청을 명확하게 하는 것이 좋다.


다음으로 수신자의 관점에서 생각하라. 

  • 수신자가 답을 주려면 어떤 정보를 제공해야하는가? 
  • 수신자에게 답변을 받기 위해 충분한 'Background information' 을 제공하면 답을 받을 수 있다. 
  • 이메일에는 수신자에 따라 적절한 에티켓이 존재함을 명심하라. (예를 들어, OMG, LOL, ㅠㅠ 등의 이모티콘은 Business 이메일에서는 좋지 않다.


2. 이메일 제목을 잘 정하기 


두 번째는 이메일 제목 (Subject line) 을 정하는 것이다. "안녕하세요." 와 같은 제목은 스팸 메일함으로 가기 딱 좋은 제목이다. 포인트는 이메일의 제목을 모호하지 않고, 목적을 포괄하면서도 간결하게 정하는 것이다. 예를 들어, 회사에 지원을 하기 위한 이메일이라면 지원하고자하는 직위명을 메일 제목에 명시하자. 또한 제목을 정하는 것은 나중에 수신 메일함에서 검색을 할 때에도 용이하다. 단순히 "질문입니다." 와 같은 이메일 보다, "마케팅 방법에 대한 질문입니다." 와 같이 보다 구체적으로 적으면 나중에 메일을 검색하기 쉽다. 


3. 적절한 인사의 중요성  


수신자의 이름을 안다면, Title 을 붙여 부른다. 예를 들어 영어 이메일의 경우, 그 사람을 사적으로 아는 것이 아니라면 Ms, Mrs, Miss 를 붙여야 한다.  만약에 성을 모른다면 Dear Chris Smith 와 같이 Last name 으로 부르는 것이 좋다. 만약 이름을 모른다면, Hello, Dear Manager 와 같이 시작하면 좋다. 만약 아는 사람이라면 늘 부르는 이름을 쓰면 된다. 


4. 완벽한 문법과 구둣점


이메일에서 문법을 정확하게 지켜 쓰는 것을 중요하다. 왜냐하면 문법에 문제가 있을 경우, 수신자가 발신자에 대해 의식적 혹은 무의식적으로 판단을 내릴 수 있기 때문이다. 예를 들어 다음과 같은 것에 중점을 두고 문법을 정확히 작성하는 방법을 익혀보자.  

  • 만연체: 영어에서 여러개의 절이 합쳐진 매우 긴 문장을 run-on sentences 라고 한다. 이메일에서는 이러한 run-on sentences 를 지양해야한다. 만약에 이메일을 작성한 후, 문장이 너무 길다면 여러개의 짧은 문장으로 분할하는 것을 고려하자. 
  • Comma: Comma는 너무 많아서도, 너무 적어서도 안된다. 적절한 위치에 Comman 를 사용하는 것을 배우자. 
  • 주어-동사 일치: 주어-동사 일치는 1인칭, 2인칭, 3인칭 주어에 맞게 동사를 사용하는 것을 말한다. 주어-동사 일치가 맞지 않으면 좋은 커뮤니케이션을 가진 사람으로 인정받기 힘들 수도 있다. 


5. 정확한 스펠링과 대소문자 구분 


Spelling 을 체크하기 위해 여러번 읽어보는 것이 좋다. 하지만 여의치 않는 경우, Spell checker 프로그램을 사용하면 좋다. 필자는 Grammarly 의 크롬 확장 프로그램을 이용중인데, Gmail 과 함께 이용하기 좋고, 특히 editor 를 사용해 글을 작성할 때, 팝업창을 띄워 스펠링을 체크할 수 있는 점이 매우 좋다. 하지만 이러한 프로그램에 지나치게 의존하는 것은 좋지 않다. 단지 spelling 만 체크해주고, 문맥은 고려하지 않기 때문이다. 고급 기능을 활용하기 위해서는 유료 결제를 해야한다. 


Grammarly 를 이용한 tistory editor 의 팝업창 - spelling 이 잘못된 단어 빨간 밑줄을 쳐준다.


정확한 대문자를 사용하자. 생각보다 외국인은 대문자에 민감하게 반응한다. 

  • 문장의 첫 단어를 대문자로 시작한다. 
  • 적절한 단어 (예를 들어 회사 명, 나라 이름 등) 의 첫 글자를 대문자로 쓴다. 

대문자가 되어야할 글자가 소문자로 되어있거나, 소문자로 되어야할 글자가 대문자로 되어있으면, 수신자에게 혼란을 줄 수 있다. 


6.  이메일의 포맷은 최대한 심플하게


이메일은 최대한 format 이 없는 plain text 로 작성하는 것이 좋다. 워드나 에버노트 같은 텍스트 편집기의 내용 (특히 테이블 등) 을 그대로 복사-붙여넣기 하는 경우, 다른 이메일 플롯폼을 사용하는 수신자에게는 format 이 깨져서 보일 수도 있다. 



7. 최대한 간결히 


이메일을 최대한 간결하게 작성한다. 횡설수설하지 않고, 최대한 요점을 전달하는 것이 좋다. 그렇지 않은 이메일은 포인트를 놓치기 쉽고, 수신자의 이해를 떨어트린다. 이메일을 보내는 목적을 명확히 하고, 명료한 언어로 작성하자. 특히 아래 내용을 참고하면 더욱 간결하고 효과적인 이메일을 작성할 수 있다. 

  • 장황함을 줄이기: 특히, 능동태를 사용하자. "Jack sent me the forms" 은 "The forms were sent to me by Jack" 보다 이해가 쉽다. 
  • 포인트에 집중: 어떤 아이디어에 대한 추가적인 정보를 알려주고 싶은 유혹에 빠지지 말자. 수신자가 알고싶어 하는 내용, 포인트에 집중하는 것이 좋다.
  • Bullet Points 를 이용하자: Bullet Points (혹은 -, * 등도 좋다.) 는 수신자에게 무엇이 중요한 정보인지 알려줄 수 있고, 논리 구성을 쉽게 알 수 있도록 한다. 


8. 보내기 전에 다시 한 번 생각하기 


보내기전에 다시 한 번 확인한고, 최대한 줄일 수 있는 부분을 줄여서 전달하는 것이 좋다. 같은 내용이라면 최대한 짧은 것이 좋다. 특히, 이메일을 작성할 때, 화나 있거나, 감정적인 경우도 많은데, 본인의 이메일을 썼을 때의 감정을 다시 되돌아보고, 마음에 걸린다면 바로 보내지말고 Save (임시보관) 버튼을 누르자. 그리고 몇 시간이 지난 후 다시 한 번 내용을 확인하고 보내는것도 좋은 방법이다. 


예약 발송 기능을 활용하는 것도 좋은 팁이다. 이메일의 단점은 보낸 순간 돌이키기 힘들다는 것인데, 예약 발송기능을 확인하면, 실제로 보내지기 전까지 여유 텀을 주기 때문에 혹시 추가할 내용이 생각나거나, 내용의 수정이 필요한 경우 반영하여 다시 보낼 수 있다는 장점이 있다. Gmail 의 경우 보내기 옆에 화살표 모양을 클릭하면, 예약 발송기능을 활용할 수 있다. 


이러한 모든 방법을 고려해서 이메일을 보내는 것은 다소 시간이 소요될 수도 있다. 하지만, 이메일이 주 커뮤니케이션 수단일 경우, 이메일을 신중하게 작성하는 것이 결국 업무의 효율을 결정한다. 또한 이메일을 작성하는 능력은 본인의 업무 능력을 가늠할 수 있는 하나의 판단 기준이 되기도 한다. 따라서 심사숙고해서 이메일을 작성하는 것을 습관을 들이는 것은 전혀 시간 낭비가 아니다. 뱉은 말은 다시 담을 수 없듯, 이메일도 마찬가지이다. 


참고

https://www.thebalancecareers.com/write-email-that-gets-response-3542570

'Soft skills > Communication' 카테고리의 다른 글

효율적으로 이메일을 쓰는 8가지 팁  (0) 2019.06.28
영어 이메일 잘 쓰는 18가지 팁  (0) 2019.06.28

영어 이메일 잘 쓰는 18가지 팁


편한 관계에서 이메일을 주고 받는 경우, 의미만 통하면 그만이지만, 비지니스 관계에서는 에티켓을 숙지하는 것이 관계에 있어 중요하다고 할 수 있다. 하지만 영어에 익숙하지 않은 경우 이것을 자연스럽게하기 힘들다. 어떻게 하면 프로답게 이메일을 작성할 수 있을까? 먼저, 기본적인 이메일의 포맷을 배우고, 많이 사용하는 표현을 익히고 상황에 맞게 변형하여 사용하는 것이 첫 번째일 것이다. 이를 학습하기 위한 유용한 링크를 첨부한다.


https://www.fluentu.com/blog/english-kor/%EC%98%81%EC%96%B4-%EC%9D%B4%EB%A9%94%EC%9D%BC-%EC%93%B0%EB%8A%94-%EB%B0%A9%EB%B2%95-18%EA%B0%9C%EC%9D%98-%EC%A4%91%EC%9A%94-%ED%8C%81%EA%B3%BC-%EC%83%98%ED%94%8C-%EC%9D%B4%EB%A9%94%EC%9D%BC-3/

'Soft skills > Communication' 카테고리의 다른 글

효율적으로 이메일을 쓰는 8가지 팁  (0) 2019.06.28
영어 이메일 잘 쓰는 18가지 팁  (0) 2019.06.28

영어 학술 프리젠테이션에서 자주 쓰는 문구 정리


본 포스팅에서는 학술 영어의 특징과 영어 학술 프리젠테이션에서 자주 쓰이는 문구를 정리해보고자 합니다. 물론 중요한 것은 내용이겠지만 자주 쓰이는 표현을 익혀둔다면, 내용과 내용사이의 연결을 매끄럽게 할 수 있을 것이고, 전달력 좋은 프리젠테이션을 할 수 있을 것입니다. 


학술 영어의 특징


학술 영어의 특징은 아래와 같이 정리해볼 수 있습니다. 
  • 학술영어는 구어체보다는 형식적인 언어를 사용한다. 
  • I 를 피하고, 제 3자의 입장인것처럼 쓴다. (수동태를 많이 쓴다.)
  • 객관적이고, 공정한 표현을 쓴다.
  • 단정적인 표현을 삼가하고, 조심스러운 표현을 많이 쓴다. 

아래에 프리젠테이션의 각 단계 별로 자주 쓰이는 표현을 정리하였으며, 내용들은 https://englishforuniversity.com 을 참고하여 작성 되었습니다. 

Introduction


Greeting your audience, introducing yourself and giving the topic of your presentation. 

  • My name’s ............. and I’m going to talk about ... 
  • Good morning everybody. 
  • Thank you for coming to my talk today. 
  • My name is …… and I’m from ... 
  • Hello. I’m .............. and welcome to my presentation about ...
  • Hello. My name’s .................... and today I’m going to be talking about ... 
  • I’d like to start by introducing myself. 
  • My name’s … and the topic for my presentation today is … 
  • The theme of my talk is … 
  • My presentation this morning concerns … 
  • This afternoon I would like to talk to you about … 
  • I shall be looking at the following areas:… 
  • What I’d like to do is to discuss ... 
  • I intend to discuss ... 
  • I hope to consider the main issues around ... 
  • This morning I am going to talk about an issue which concerns everyone … 
  • This presentation focuses on the issue of…


Justifying the topic of your presentation

  • There are many concerns regarding … 
  • … has been the subject of much debate recently and this is the topic of my presentation.
  • Recent research has shown that… 
  • Did you know...........? This is the reason for my talk today. ... 
  • and this is the theme for my presentation today. 
  • … so the purpose of my presentation today is to inform/discuss/present/analyse … 
  • … is a growing problem in the world. For this reason I intend to focus on the issue of …


Giving the outline of your presentation

  • Firstly, I’m going to look at ... 
  • Secondly, I’ll move on to the issue of ... 
  • Then I’ll move on to examine ... 
  • Lastly/Finally, I’ll look at / focus on ...
  • I have divided my talk into the following main areas: ... 
  • I am going to divide my presentation into two main parts. First I’m going to describe … 
  • and then I’ll move on to look at … 
  • And in this part of my presentation I’ll be showing you some data/charts/tables … 
  • I’ll also try to explain my findings … 
  • In the third part of my presentation I’ll put forward some ideas about … 
  • I’ll also be offering some recommendations on how we can solve/address/tackle the issues of … 
  • ...then I’m going to suggest some possible measures to solve these difficulties. We’ll finish off with a question and answer session. 
  • My talk will last about ........... minutes and there’ll be time at the end for questions. 
  • At the end of my talk, which will last about ten minutes, I’ll be happy to answer any questions you may have.
  • If you have any questions please do not hesitate to ask. 
  • Please just put your hand up if you would like to ask a question. 
  • I’d like the presentation to be as interactive as possible, so please chip in as we go along. 
  • I’ve got quite a lot to get through, so I’d appreciate it if you kept your questions until the end of the presentation. 
  • I’m happy to let you have any of the slides or information in my presentation if you would like. 
  • If you leave your contact details I’ll be happy to send you any of the information here. 


Main Parts


Introducing your first main point 

  • Now, I’m going to start by … 
  • Now I’d like to focus on … 
  • First we’re going to look at … 
  • Let’s start with … 
  • The first problem I’d like to focus on is that of … 
  • Turning then to my first point, ... 
  • To begin with I’d like to say a few things about… 
  • I’d like to begin by … 
  • OK, so let’s start by looking at .... 
  • I’d like to take a minute or two to define what exactly we mean by ... 
  • I’d like to mention three points here, ...


Referring to research

  • Researchers have identified three key issues here, they are … 
  • Researchers have shown quite conclusively that … 
  • A number of recent studies, notably the ones by … and …, have shown that … 
  • A number of studies have shown that ... 
  • A study by … shows that ... 
  • Research suggests/indicates that … 
  • According to … Figures from … show/suggest/indicate that ... 
  • A very interesting study by … shows that… 
  • The study by … is on your reading list and I encourage you to take a look at it. 
  • Basically, what he found was that … 
  • One of the most interesting studies carried out in this area by … showed that …


Referring to visual data

  • If you look at this table you can see that ... 
  • The data here shows that... 
  • Please take a handout and pass them on. 
  • There are some handouts coming round on … 


Presenting a point of view

  • Those in favour of … argue that … 
  • Advocates of … claim that ... 
  • Some people claim that … but others … 
  • Most people/scientists would argue that … 
  • I think it’s fair to say that ... 
  • Personally, I think there is overwhelming evidence that ... 
  • Evidence does seem to show that ...


Analysing an argument

  • Let’s take a closer look at the argument put forward by ... His main contention is that ... but he fails to consider ... 
  • Even if we accept the point that ... that still leaves the question of ... 
  • The argument put forward by ... doesn’t explain ... 
  • The weakness in this argument is that ... 
  • This point of view is very appealing because ...


Emphasizing important points

  • It must be remembered that … 
  • It should be emphasised that … 
  • I would like to draw your attention to this point …


Losing your way

  • Now, where was I? Oh yes, … 
  • If you’ll bear with me for a moment while I just glance at my notes, right, … 
  • Erm, I’ll just need a minute to sort out the technology and I’ll be with you ... 


Moving to another main point

  • OK, so now I’d like to turn to my next point, which is ... 
  • Moving on, I’d like to take a look at …. 
  • Now I’d like to move on to ... 
  • Now let’s turn to the issue of ... 
  • I’ll come back to that issue later... 
  • I want to turn now to ... 
  • Turning now to ... 
  • Moving on now to ... 
  • Having looked at ….. 
  • let’s now think about ... 
  • My next point is in regards to … T
  • hat brings me to … 
  • My final point is in regard to…


Making recommendations

  • Now I’d like to look at some of the measures that can be taken to alleviate the problems of … 
  • In order to solve these problems, the following action should be considered: ... 
  • Firstly, the government should … 
  • The most important thing that should be done to combat the problem of ... is... 
  • Other possible solutions would be to ...


Conclusion


Making conclusions and summarising your main points 

  • To conclude my presentation, ... 
  • In conclusion, ... 
  • To summarise the main points of my presentation … 
  • In view of the evidence I have presented I think it is fair to say that … 
  • After all is said and done I think we can conclude that … 
  • This is clearly a very complex issue but on the strength of the evidence I have seen I would say that …/it seems that …


Finishing your presentation

  • OK we’re coming to the end of the presentation so I’d just like to thank you for listening ... 
  • OK. That bring us to the end of my presentation. 
  • Thank you for listening. 
  • I hope you found it interesting. 


Questions


Asking for questions 

  • Would anyone like to ask any questions? 
  • I’m ready to take any questions now. 
  • If anyone has questions I’ll be happy to answer them. 


Answering questions

  • Thanks for your question ... 
  • Good question. I think ... 
  • That’s an interesting question! As I see it ... 
  • Yes, that’s an interesting point ...

Dealing with difficult questions 

  • Hmm, that’s a good question. I don’t have the information to answer that question right now, but I’d be happy to find out and get back to you later. 
  • I don’t think we have enough time to go into that right now, but I’ll be happy to speak to you one-to-one after the presentation if you would like. 
  • That’s an interesting point, but I do think I have shown that ... 


Asking questions to the presenter

  • Excuse me. Can you say a bit more about ... 
  • Can you repeat your point about ... 
  • Excuse me. I have a question about ...
  • I didn’t catch what you said about .... 
  • Can you repeat it please? 
  • Are you saying that ...? 
  • Can you suggest some reading on that topic?



출처

https://englishforuniversity.com


Presentation phrasebook.pdf


티스토리 블로그에서 수식 쉽게 쓰기


아래 스크립트를 [블로그 관리]- [스킨 편집] - [html 편집] 후 head 아래에 아무곳에나 붙여넣으시면 됩니다.


<script>

(function () {

var script = document.createElement("script");

script.type = "text/javascript";

script.src  = "https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML";

document.getElementsByTagName("head")[0].appendChild(script);

})();

</script>


아래 스크린샷처럼 head 태그 내부 아무곳에나 위 코드를 붙여 넣고 저장을 누르면 됩니다. 




이 스크립트를 적용하면 R markdown에서 사용하는 수식의 문법을 그대로 이용할 수 있습니다.


이 문법은 $표시로 수식의 시작과 끝을 나타내는데, 예를 들어 x의 제곱을 쓰고 싶다면 $표시를 두 번 사용후 x^2을 입력하고 $표시 두 번으로 수식이 끝났다고 표시하면 쉽게 x의 제곱을 나타낼 수 있습니다.


$$x^2$$


$$x^2$$


아래와 같은 복잡한 수학 수식도 이 문법을 이용하면 간단하게 표현할 수 있습니다.


$$\int_0^{2\pi} \sin x~dx$$


$$\int_0^{2\pi} \sin x~dx$$



이외에도 다양한 수학 수식을 표현할 수 있습니다. 문법은 구글에 R markdown formula 등을 검색하시면 쉽게 찾을 수 있는데 예를 들어 이곳을 참고하시면 좋습니다.




필자가 설치한 환경은 운영체제 우분투 14.04 LTS Server 버전이고 GPU는 1080TI를 사용한다.


1. CUDA 설치


https://developer.nvidia.com/cuda-downloads


linux -> x86_64 -> Ubuntu -> 16.04 -> deb(network)

출처: http://goodtogreate.tistory.com/entry/TensorFlow-GPU-버전-우분투-1604에-설치-하기 [GOOD to GREAT]
linux -> x86_64 -> Ubuntu -> 16.04 -> deb(network)

출처: http://goodtogreate.tistory.com/entry/TensorFlow-GPU-버전-우분투-1604에-설치-하기 [GOOD to GREAT]
linux -> x86_64 -> Ubuntu -> 16.04 -> deb(network)

출처: http://goodtogreate.tistory.com/entry/TensorFlow-GPU-버전-우분투-1604에-설치-하기 [GOOD to GREAT]

이렇게 선택후 아래 나오는 대로 한다. (deb파일 다운로드후 입력하라는 커맨드 입력하면 설치됨)


  1. `sudo dpkg -i cuda-repo-ubuntu1404_8.0.61-1_amd64.deb`
  2. `sudo apt-get update`
  3. `sudo apt-get install cuda`


2. cuDNN설치


https://developer.nvidia.com/rdp/cudnn-download


해당 링크에서 로그인이 필요하다. 로그인 후에,,


Download cuDNN v7.0 (August 3, 2017), for CUDA 8.0 <= 이거 설치


이 때, CUDA 버전에 맞는 cuDNN을 설치하여야 한다. 저는 CUDA 8.0 이므로 위 링크 cuDNN을 설치.

* wget 으로 해당링크 다운받으려하니 404 forbidden 오류가 뜬다.

* FTP로 그냥 압축파일을 서버로 옮겼다.



tar xvzf cudnn-8.0-linux-x64-v7.tgz

sudo cp -P cuda/include/cudnn.h /usr/local/cuda/include

sudo cp -P cuda/lib64/libcudnn* /usr/local/cuda/lib64

sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*


sudo apt-get install libcupti-dev



또한 ~/.bashrc에 cuda, cudnn 라이브러리 경로를 적어두어야한다.


vi ~/.bashrc


로 파일을 열어서 맨 밑에 아래 텍스트 추가.



export PATH="/home/jyahn/anaconda2/bin:$PATH"
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64"
export CUDA_HOME=/usr/local/cuda

tar xvzf cudnn-8.0-linux-x64-v5.1-ga.tgz
sudo cp -P cuda/include/cudnn.h /usr/local/cuda/include
sudo cp -P cuda/lib64/libcudnn* /usr/local/cuda/lib64
sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*


출처: http://goodtogreate.tistory.com/entry/TensorFlow-GPU-버전-우분투-1604에-설치-하기 [GOOD to GREAT]
tar xvzf cudnn-8.0-linux-x64-v5.1-ga.tgz
sudo cp -P cuda/include/cudnn.h /usr/local/cuda/include
sudo cp -P cuda/lib64/libcudnn* /usr/local/cuda/lib64
sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*


출처: http://goodtogreate.tistory.com/entry/TensorFlow-GPU-버전-우분투-1604에-설치-하기 [GOOD to GREAT]
tar xvzf cudnn-8.0-linux-x64-v5.1-ga.tgz
sudo cp -P cuda/include/cudnn.h /usr/local/cuda/include
sudo cp -P cuda/lib64/libcudnn* /usr/local/cuda/lib64
sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*


출처: http://goodtogreate.tistory.com/entry/TensorFlow-GPU-버전-우분투-1604에-설치-하기 [GOOD to GREAT]



tar xvzf cudnn-8.0-linux-x64-v5.1-ga.tgz
sudo cp -P cuda/include/cudnn.h /usr/local/cuda/include
sudo cp -P cuda/lib64/libcudnn* /usr/local/cuda/lib64
sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*

추가적인 dependencies도 설치한다.

$ sudo apt-get install libcupti-dev


출처: http://goodtogreate.tistory.com/entry/TensorFlow-GPU-버전-우분투-1604에-설치-하기 [GOOD to GREAT]

3. tensorflow GPU 설치


아래 링크에 따라 virtual env를 구성한다.

https://github.com/Dataweekends/zero_to_deep_learning_udemy



이후,



source activate ztdl

conda install tensorflow-gpu



4. 설치되었나 확인


bash에서


python


>> import tensorflow as tf

>> sess = tf.Session()



아래와 같이 GPU 이름이 나오면 성공.


name: GeForce GTX 1080 Ti
major: 6 minor: 1 memoryClockRate (GHz) 1.582
pciBusID 0000:02:00.0
Total memory: 10.91GiB
Free memory: 10.75GiB
2017-08-30 17:41:13.373074: W tensorflow/stream_executor/cuda/cuda_driver.cc:523] A non-primary context 0x2d63250 exists before initializing the StreamExecutor. We haven't verified StreamExecutor works with that.
2017-08-30 17:41:13.374815: I tensorflow/core/common_runtime/gpu/gpu_device.cc:940] Found device 1 with properties:
name: GeForce GTX 1080 Ti
major: 6 minor: 1 memoryClockRate (GHz) 1.582
pciBusID 0000:03:00.0
Total memory: 10.91GiB
Free memory: 10.75GiB
2017-08-30 17:41:13.695077: W tensorflow/stream_executor/cuda/cuda_driver.cc:523] A non-primary context 0x2d67600 exists before initializing the StreamExecutor. We haven't verified StreamExecutor works with that.
2017-08-30 17:41:13.696140: I tensorflow/core/common_runtime/gpu/gpu_device.cc:940] Found device 2 with properties:
name: GeForce GTX 1080 Ti
major: 6 minor: 1 memoryClockRate (GHz) 1.582
pciBusID 0000:82:00.0
Total memory: 10.91GiB
Free memory: 10.75GiB
2017-08-30 17:41:14.016589: W tensorflow/stream_executor/cuda/cuda_driver.cc:523] A non-primary context 0x2d6b9b0 exists before initializing the StreamExecutor. We haven't verified StreamExecutor works with that.
2017-08-30 17:41:14.017710: I tensorflow/core/common_runtime/gpu/gpu_device.cc:940] Found device 3 with properties:
name: GeForce GTX 1080 Ti
major: 6 minor: 1 memoryClockRate (GHz) 1.582
pciBusID 0000:83:00.0
Total memory: 10.91GiB
Free memory: 10.75GiB



참고


http://goodtogreate.tistory.com/entry/TensorFlow-GPU-%EB%B2%84%EC%A0%84-%EC%9A%B0%EB%B6%84%ED%88%AC-1604%EC%97%90-%EC%84%A4%EC%B9%98-%ED%95%98%EA%B8%B0