gitweixin
  • 首页
  • 小程序代码
    • 资讯读书
    • 工具类
    • O2O
    • 地图定位
    • 社交
    • 行业软件
    • 电商类
    • 互联网类
    • 企业类
    • UI控件
  • 大数据开发
    • Hadoop
    • Spark
    • Hbase
    • Elasticsearch
    • Kafka
    • Flink
    • 数据仓库
    • 数据挖掘
    • flume
    • Kafka
    • Hive
    • shardingsphere
    • solr
  • 开发博客
    • Android
    • php
    • python
    • 运维
    • 技术架构
    • 数据库
  • 程序员网赚
  • bug清单
  • 量化投资
  • 在线查询工具
    • 去行号
    • 在线时间戳转换工具
    • 免费图片批量修改尺寸在线工具
    • SVG转JPG在线工具

月度归档4月 2022

精品微信小程序开发门户,代码全部亲测可用

  • 首页   /  2022   /  
  • 4月
  • ( 页面2 )
mysql, 数据库 4月 6,2022

Oracle 与 MySQL:语法和使用详细比较

数据库管理系统允许组织对可用数据进行分类和结构化,以创建一个流畅、更有条理的工作环境。 它们是企业的基础,因为它们提供了管理大量和各种数据类型的有效方法。 因此,公司可以更快地做出明智的决定。 选择正确的数据库管理系统会有所作为。 虽然有些系统具有符合您的业务目标的特定功能,但其他系统根本没有。 如果您要决定下一个数据库管理系统,是使用 MySQL 还是 Oracle,以下比较将为您提供做出正确决定所需的信息。

Oracle 和 MySQL 之间的主要区别
虽然 MySQL 和 Oracle 都提供了与关系模型相同的体系结构,并提供了许多标准功能,例如专有软件许可证,但这两种工具之间存在一些关键差异。

MySQL 提供 GPL 软件许可,而 Oracle 没有。
Oracle 与 Linux、UNIX、Windows、Mac OS X 和 z/OS 兼容。 MySQL 与所有这些以及 Symbian、BSD 和 AmigaOS 兼容。
MySQL 仅支持全文和哈希索引。 Oracle 使用的索引不止这些,包括位图、基于函数、分区等。
Oracle 支持分布式数据库,而 MySQL 不支持
Oracle 更适合企业部署,而 MySQL 更适合中小型规模。
MySQL 是免费的,而 Oracle 需要许可费。

甲骨文概述
Oracle 是一个关系数据库管理系统,旨在实现自动驱动、自我保护、自我修复,并消除容易出错的手动数据库管理。它可以在各种操作系统上运行,并允许安全存储和快速检索数据。 Oracle 是第一个为商业目的而开发的使用查询语言管理数据的数据库工具,于 1980 年发布,具有基本的 SQL 功能。

Oracle 数据库特性
它是可扩展的、可移植的、分布式的和可编程的。
它允许在不知道数据的物理存储的情况下与数据库进行交互。
Oracle 使跨不同平台的应用程序与 Oracle 数据库之间的通信顺畅。
Oracle数据库可以运行在Windows、Linux、Mac等多种操作系统上。
它使 ACID 属性能够维护数据的完整性和可靠性。
它可以快速管理大量数据。
它有一个恢复管理器工具,可提供冷、热和增量数据库备份和恢复。
Oracle 的其他一些好处包括:

能够运行大型 ILTB 和 VLDB。
功能非常丰富。
可靠的。
提供闪回技术。

MySQL概述
MySQL 是一种流行的数据库管理系统,专为处理关系数据库而设计。它是 Oracle 公司支持的可扩展的开源工具。与 Oracle 数据库相比,MySQL 的处理速度一样快,并且它的界面经常在评论网站上被引用为更直观和更易于使用。

瑞典公司 MySQL AB 开发并支持 MySQL。 2008 年 1 月,Sun Microsystems 以 10 亿美元收购了 MySQL AB。 2009 年 4 月,甲骨文公司同意收购 Sun Microsystems,当时是 MySQL 版权和商标的所有者。许多大大小小的公司都使用 MySQL。 MySQL 适用于许多操作系统,如 Windows、Linux、macOS 等,使用 C、C++ 和 Java 语言。

MySQL 数据库功能
它是免费和开源的。
MySQL 是一个易于使用的关系数据库管理系统。
它遵循客户端/服务器架构。
它提供了卓越的性能、高度的灵活性和更高的生产力。
它是可扩展的。
令人难以置信的安全性
它使事务能够回滚、提交和崩溃恢复。

Comparison Basis MySQL Oracle
发行年份 1995 1980
价格 It is free and open-source. It is licensed under the GNU. It is licensed for commercial purposes The express edition is free for students.
操作系统支持 WindowsMac OS XLinuxUNIXz/OSBSDSymbianAmigaOS WindowsMac OS XLinuxUNIXz/OS
弹性 Better for small and big businesses Better for large-scale deployments
Data Partitioning Not Supported Supported
安全性 Username, password, and host required to access the database Username, password, and profile validation required to access the database
System Type Static system. Static and dynamic systems.
Null Value Supported Not Supported
Character Support CHAR and VARCHAR. CHAR, VARCHAR2, NCHAR, and NVARCHAR2.
语言支持 SQL SQL and PL/SQL

如 Oracle 文档中所述,Oracle 与 MySQL 语法的一些显着差异如下:

MySQL Data Type Oracle Data Type
BIGINT NUMBER(19, 0)
BIT RAW
BLOB BLOB, RAW
CHAR CHAR
DATE DATE
DATETIME DATE
DECIMAL FLOAT (24)
DOUBLE FLOAT (24)
DOUBLE PRECISION FLOAT (24)
ENUM VARCHAR2
FLOAT FLOAT
INT NUMBER(10, 0)
INTEGER NUMBER(10, 0)
LONGBLOB BLOB, RAW
LONGTEXT CLOB, RAW
MEDIUMBLOB BLOB, RAW
MEDIUMINT NUMBER(7, 0)
MEDIUMTEXT CLOB, RAW
NUMERIC NUMBER
REAL FLOAT (24)
SET VARCHAR2
SMALLINT NUMBER(5, 0)
TEXT VARCHAR2, CLOB
TIME DATE
TIMESTAMP DATE
TINYBLOB RAW
TINYINT NUMBER(3, 0)
TINYTEXT VARCHAR2
VARCHAR VARCHAR2, CLOB
YEAR NUMBER

Oracle 与 MySQL:如何选择
在 MySQL 与 Oracle 之间进行选择时,必须了解每种工具的优势和劣势,因为它与您期望的业务成果相关。

Oracle 何时是更好的选择?
Oracle 是财富 100 强公司和大型企业的普遍选择,因为它专为大型业务应用程序和大型数据仓库而设计。

那些寻找最广泛的特性列表的人会选择 Oracle,因为它包含各种特性,并且最大限度地减少了对第三方软件的需求。

什么时候 MySQL 是更好的选择?
MySQL 为较小规模的项目提供了更好的选择。 通过将数据库驱动的应用程序迁移到 MySQL,或者将 MySQL 用于新的开发项目,企业正在实现成本节约,这些成本节省了很多倍,达到了数十万美元。 对于初创公司和小型公司,MySQL 更适合。

作者 east
Tensorflow, 人工智能 4月 5,2022

解决在kaggle等在线平台运行报错module ‘tensorflow’ has no attribute ‘InteractiveSession’

学习tensorflow,除了本地安装一个外,更喜欢去在线平台玩,特别是kaggle这种带有数据集的。看书仿照下面的例子,没想到运行出错了。

# 进入一个交互式 TensorFlow 会话.
import tensorflow as tf

sess = tf.InteractiveSession()

x = tf.Variable([1.0, 2.0])
a = tf.constant([3.0, 3.0])

# 使用初始化器 initializer op 的 run() 方法初始化 'x' 
x.initializer.run()

# 增加一个减法 sub op, 从 'x' 减去 'a'. 运行减法 op, 输出结果 
sub = tf.subtract(x, a)
print(sub.eval())

运行报下面错误:

--------------------------------------------------------------------------- AttributeError                            Traceback (most recent call last) /tmp/ipykernel_33/152899263.py in <module>      
2 import tensorflow as tf
3 ---->
4 sess = tf.InteractiveSession()
5 #tf.compat.v1.disable_eager_execution()
6 #sess = tf.compat.v1.InteractiveSession()
AttributeError: module 'tensorflow' has no attribute 'InteractiveSession'

由于版本问题,要用下面的语句替代

使用 sess = tf.compat.v1.InteractiveSession()

解决了这个问题,又出现新的问题:
AttributeError: ‘NoneType’ object has no attribute ‘run’ ,
这需要在sess之前添加tf.compat.v1.disable_eager_execution()

新的完整代码如下:

# 进入一个交互式 TensorFlow 会话.
import tensorflow as tf

tf.compat.v1.disable_eager_execution()
sess = tf.compat.v1.InteractiveSession()
x = tf.Variable([1.0, 2.0])
a = tf.constant([3.0, 3.0])

# 使用初始化器 initializer op 的 run() 方法初始化 'x' 
x.initializer.run()

# 增加一个减法 sub op, 从 'x' 减去 'a'. 运行减法 op, 输出结果 
sub = tf.subtract(x, a)
print(sub.eval())
作者 east
深度学习 4月 5,2022

Word Embedding的几种模型和示例

介绍

人类有能力理解单词并轻松地从中获取含义。然而,在当今世界,大多数任务都是由计算机执行的。例如,如果您想知道今天是晴天还是下雨天,则必须在 Google 中输入文本查询。现在的问题是,机器将如何频繁地理解和处理文本中呈现的如此大量的信息?答案是词嵌入。

Word Embeddings 基本上是向量(文本转换为数字),用于捕获单词的含义、各种上下文和语义关系。嵌入本质上是使用预定义字典将单词映射到其对应向量。

例如,

句子: It will rain heavily today.

字典:{“it”:[1,0,0,0,0],“will”:[0,1,0,0,0],“rain”:[0,0,1,0,0] , “ heavily ”: [0,0,0,1,0], “today”: [0,0,0,0,1]}

在这里,每个单词都被分配了一个唯一的向量(例如),以便区分所有单词。

Let the corpus comprise three sentences.

S1 = In monsoon, it will rain.

S2 = rain rain come again.

S3 = sun is visible in summer. In the monsoon, the sun is hidden by clouds.

Let N be the list of unique words = [‘monsoon’, ‘rain’, ‘come’, ‘again’, ‘sun’, ‘visible’, ‘summer’, ‘hidden’, ‘clouds’]

计数矩阵的维度将是 3X9,因为语料库中有 3 个文档和 9 个唯一词。
计数矩阵如下所示:

优点:由于只考虑单词的频率,因此计算成本较低。


缺点:由于计算只是基于计数并且没有考虑单词的上下文,因此该方法证明不太有用。
代码:

#Importing libraries
from sklearn.feature_extraction.text import CountVectorizer
import nltk 
from nltk.corpus import stopwords 
from nltk.tokenize import word_tokenize 

#Downloading stopwords and punkt packages
nltk.download('stopwords') 
nltk.download('punkt') 

#Initialising stopwords for english
set(stopwords.words('english')) 

#sample sentences
text = ["In monsoon, it will rain", "rain rain come again", "sun is visible in summer. In the monsoon, the sun is hidden by clouds"]

#set of stop words
stop_words = set(stopwords.words('english')) 
all_sentences = []

#Logic for removing stop words and obtaining filtered sentences from the list 

for i in range(len(text)):
  word_tokens[i] = word_tokenize(text[i]) 
  tokenized_sentence = []

  for j in word_tokens[i]: 
      if j not in stop_words: 
          tokenized_sentence.append(j) 
  all_sentences.append(" ".join(tokenized_sentence))

#Initialising the CountVectorizer
countvectorizer = CountVectorizer()

#Applying CountVectorizer to the list of sentences
X = countvectorizer.fit_transform(all_sentences)

#Converting output to array
result = X.toarray()

print("Sentences after removing stop words", all_sentences)
print("Count Vector:", result)

2.TF-IDF:

TF-IDF 代表词频-逆文档频率。 该方法是对 Count Vector 方法的即兴创作,因为特定单词的频率被考虑在整个语料库中,而不仅仅是单个文档。 主要思想是对某些文档非常具体的词给予更多的权重,而对更普遍且在大多数文档中出现的词给予较少的权重。

例如,诸如“is”、“the”、“and”之类的通用词会经常出现,而诸如“Donald Trump”或“Indira Gandhi”之类的词将特定于特定文档。

数学上,

词频 (TF) = 词条在文档中出现的次数 / 文档中词条的总数

逆文档频率 (IDF) = log(N/n) 其中 N 是文档总数,n 是一个术语出现的文档数。

考虑以下示例。
给出了两个文档——D1 和 D2。

TF(Today, Document 1) = 1/8

TF(Today, Document 2) = 1/8

TF(sunny, Document 1) = 4/8

IDF(Today) = log(2/2) = log(1) = 0

IDF(sunny) = log(2/1) = log(2) = 0.301

Therefore,

TF-IDF(Today, Document 1) = 1/8 * 0 = 0

TF-IDF(Today, Document 2) = 1/8 * 0 = 0

TF-IDF(sunny, Document 1) = 4/8 * 0.301 = 0.1505

从上面的计算可以看出,与文档 1 的上下文中的重要词“sunny”相比,常用词“Today”的权重较低。

优点:

它在计算上很容易。
文档中最重要的单词是通过基本计算提取的,不需要太多努力。

缺点:

它无法捕捉单词的语义,只能像词汇级别的特征一样工作。
代码:

from sklearn.feature_extraction.text import TfidfVectorizer 
import pandas as pd

#Declaring the list of sentences
documents = ['Today is sunny day', 'Today is rainy day']

#Initialising Tfidf Vectorizer
vectorizer = TfidfVectorizer()

#Fitting the Vectorizer to the list
X = vectorizer.fit_transform(documents)
print(X)

#Printing the feature names
print(vectorizer.get_feature_names()) 

matrix = X.todense()
tfidf_list = matrix.tolist()
tfidf_df = pd.DataFrame(tfidf_list, columns = vectorizer.get_feature_names())

print(tfidf_df)

3.Word2Vec:

Word2Vec 是一种基于预测的词嵌入方法。 与确定性方法不同,它是一个浅层的两层神经网络,能够预测单词之间的语义和相似性。 Word2Vec 是两种不同模型的组合——(i)CBOW(连续词袋)和(ii)Skip-gram。

模型概述 – CBOW(连续词袋)和 Skip-gram。

word_2_vec

3.1 CBOW(连续词袋):

该模型是一个浅层神经网络,可以在给定上下文的情况下预测单词的概率。 这里,上下文是指围绕要预测的单词的单词的输入。
CBOW模型的架构:

Architecture of CBOW model

作为第一步,输入是通过为给定文本形成一个词袋来创建的。
例如,

Sentence 1 = All work and no play make Jack a dull boy.

Sentence 2 = Jack and Jill went up the hill.

Bag of Words: {“All”:1, “work”:1, “no”:1, “play”:1, “makes”:1, “Jack”:2, “dull”:1, “boy”:1, “Jill”:1, “went”:1, “up”:1, “hill”:1} (after removing the stop words)

这个由单词及其出现频率组成的输入作为向量发送到输入层。对于 X 个单词,输入将是 X[1XV] 个向量,其中 V 是向量的最大长度。

接下来,输入隐藏层矩阵由维数 VXN 组成,其中 N 是表示单词的维数。输出隐藏层矩阵由维数 NXV 组成。在这里,这些值是通过将输入乘以隐藏输入权重来计算的。

在输出层,通过将隐藏输入乘以隐藏输出权重来计算输出。在隐藏层和输出层之间计算的权重给出了单词的表示。作为一个连续的中间步骤,通过对输出和目标值之间计算的误差使用反向传播来调整权重。
优点:

与确定性方法相比,概率性方法给出了更好的结果。
由于不需要计算巨大的矩阵,因此内存需求较少。
缺点:

优化非常重要,否则培训将需要很长时间才能完成。


3.2 Skip-gram :

Skip-gram 模型预测给定单词的上下文,与 CBOW 所做的正好相反。 Skip-gram 模型的架构:

Architecture of Skip-gram model:

输入层大小:[1XV],输入隐藏权重矩阵大小:[VXN],输出隐藏权重矩阵:[NXV],输出层大小:C[1XV]

模型的输入和直到隐藏层的进一步步骤将类似于 CBOW。 输出目标变量的数量取决于上下文窗口的大小。 例如,如果上下文窗口的大小为 2,那么将有四个目标变量,两个词在给定词之前,两个词在给定词之后。

将针对四个目标变量计算四个单独的误差,并通过执行元素相加获得最终向量。 然后反向传播这个最终向量以更新权重。 对于训练,输入和隐藏层之间的权重用于单词表示。

优点:

Skip-gram 模型可以捕获单词的不同上下文信息,因为每个上下文都有不同的向量表示。
对于不常用的术语更准确,并且适用于更大的数据库。
缺点:

它需要更多的 内存 进行处理。
代码:

要使用 genism 库中预训练的 Word2Vec 模型:

import gensim 
import gensim.downloader as api
from gensim.models.keyedvectors import KeyedVectors

#loading pretrained model
nlp_w2v = api.load("word2vec-google-news-300") 

#save the Word2Vec model
nlp_w2v.wv.save_word2vec_format('model.bin', binary=True)

#load the Word2Vec model 
model = KeyedVectors.load_word2vec_format('model.bin', binary=True)

#Printing the most similar words to New York from vocabulary of pretrained model
model.most_similar('New_York')

从头开始训练 Word2Vec 模型:

import gensim 
'''
Data for training Word2Vec
train: A data frame comprising of text samples
'''

#training data
corpus = train

#creates a list for a list of words for every training sample
w2v_corpus = []
for document in corpus:
   w2v_words = document.split()
   w2v_grams = [" ".join(w2v_words[i:i+1]) 
               for i in range(0, len(w2v_words), 1)]
   w2v_corpus.append(w2v_grams)

#initialising and training the custom Word2Vec model 
'''
size: dimensions of word embeddings 
window: context window for words 
min_count: words which appear less number of times than this count will be ignored 
sg: To choose skip-gram model 
iter: Number of epochs for training
'''

word2vec_model = gensim.models.word2vec.Word2Vec(w2v_corpus, size=300,   
            window=8, min_count=1, sg=1, iter=30)

#vector size of the model
print(word2vec_model.vector_size)

#vocabulary contained by the model
print(len(word2vec_model.wv.vocab))

4.GloVE:

GloVe 代表词表示的全局向量。 该算法是对 Word2Vec 方法的改进,因为它考虑全局统计而不是局部统计。 在这里,全局统计数据意味着从整个语料库中考虑的单词。 GloVe 基本上试图解释特定单词对在文档中出现的频率。 为此,构建了一个共现矩阵,该矩阵将表示特定单词相对于另一个单词的存在。

例如,

Corpus – It is rainy today, tomorrow it will be sunny and the day after will be windy.

上面的矩阵表示一个共现矩阵,其值表示在给定示例语料库中一起出现的每对单词的计数。

在计算给定“today”、p(rainy/today) 和给定“tomorrow”、p(rainy/tomorrow) 的单词“rainy”的出现概率后,结果是与“rainy”最相关的单词 与“明天”相比,“今天”是“今天”。

代码:

#Import statements
from numpy import array
from numpy import asarray
from numpy import zeros
from keras.preprocessing.text import Tokenizer 

#Download the pretrained GloVe data files
!wget http://nlp.stanford.edu/data/glove.6B.zip

#Unzipping the zipped folder
!unzip glove*.zip

#Initialising a tokenizer and fitting it on the training dataset
'''
train: a dataframe comprising of rows containing text data
'''
tokenizer = Tokenizer(num_words=5000)
tokenizer.fit_on_texts(train)

#Creating a dictionary to store the embeddings
embeddings_dictionary = dict()

#Opening GloVe file
glove_file = open('glove.6B.50d.txt', encoding="utf8")

#Filling the dictionary of embeddings by reading data from the GloVe file
for line in glove_file:
    records = line.split()
    word = records[0]
    vector_dimensions = asarray(records[1:], dtype='float32')
    embeddings_dictionary[word] = vector_dimensions
glove_file.close()

#Parsing through all the words in the input dataset and fetching their corresponding vectors from the dictionary and storing them in a matrix 
embedding_matrix = zeros((vocab_size, 50))
for word, index in tokenizer.word_index.items():
    embedding_vector = embeddings_dictionary.get(word)
    if embedding_vector is not None:
        embedding_matrix[index] = embedding_vector

#Displaying embedding matrix 
print(embedding_matrix) 

结论:

在这篇博客中,我们回顾了一些方法——Count Vector、TF-IDF、Word2Vec 和 GloVe,用于从原始文本数据创建词嵌入。 预处理文本然后发送预处理数据以创建词嵌入总是一个好习惯。 作为进一步的步骤,这些词嵌入可以发送到机器学习或深度学习模型,用于各种任务,例如文本分类或机器翻译。

作者 east
Hive, 数据库 4月 4,2022

Hive对比SQL:哪个更适合数据分析

Hive 和 SQL 之间的主要区别:

架构:Hive 是一个用于数据分析的数据仓库项目; SQL 是一种编程语言。 (但是,Hive 通过称为 HiveQL 的编程语言执行数据分析,类似于 SQL。)


设置:Hive 是一个基于开源软件程序 Hadoop 的数据仓库。
数据分析:Hive 比 SQL 更有效地处理复杂数据,适合不太复杂的数据集。


价格:Hive 价格从每位用户每月 12 美元起。 SQL 是开源和免费的。


评论:Hive 在 G2 网站上的客户评论评分为 4.2/5。因为 SQL 是一种编程语言而不是“产品”,所以它在 G2 上没有评论。


大数据需要强大的工具。成功的组织查询、管理和分析来自数百个数据源的数千个数据集。这就是 Hive 和 SQL 等工具的用武之地。尽管非常不同,但查询和编程大数据都是如此。

但是哪种工具适合您的组织?在这篇评论中,我们在功能、价格、支持、用户评分等方面比较了 Hive 与 SQL。

什么是Hive?
Apache Hive 是一个用于数据查询和分析的数据仓库项目。 Hive 建立在 Apache Hadoop(一个用于处理大数据的开源程序)之上,通过查询语言 HiveQL 执行数据分析,它允许用户构建数据并生成各种有用的分析。

Hive 由 Facebook 开发,使希望从电子表格、网络日志、CRM 系统等中查询和汇总数据的用户受益。 它在 Hadoop 分布式文件系统 (HDFS) 中查询数据,并将该系统用于自己的存储。 它还运行 MapReduce 作业。

什么是 SQL?
结构化查询语言 (SQL) 是一种特定于领域的编程语言,用于管理数据和/或处理数据流。它主要管理数据并处理关系数据库管理系统中保存的实时数据。在这篇评论的上下文中,SQL 就像 HiveQL。

SQL 由 Oracle 开发,是一种用于分析查询的声明性语言。它比 Hive(和 HiveQL)更新得多。 SQL 可以追溯到 45 年前,并且在许多 IT 系统中已经无处不在。

有关我们的原生 SQL 连接器的更多信息,请访问我们的集成页面。

Hive 和 SQL 的区别
Hive 在 HDFS 中写入和查询数据。 SQL 需要多次读取和写入。
Hive 更适合分析复杂的数据集。 SQL 更适合快速分析不太复杂的数据集。
SQL 支持联机事务处理 (OLTP)。 Hive 不支持 OLTP。
Hive 查询可能具有高延迟,因为 Hive 通过 Hadoop 运行批处理。这意味着某些查询要等待一个小时(或更长时间)。更新 Hive 上的数据也可能需要很长时间。

支持和培训
HIVE
一个在线社区(Apache 软件基金会)
资源
邮件列表
语言手册


SQL
虽然没有提供官方培训,但有各种 SQL 第三方培训模块/支持社区。

价钱
HIVE
计划从每位用户每月 12 美元起。
有 14 天的免费试用期。
SQL
作为一个开源平台,SQL 是 100% 免费的。 但是,SQL 定价并未考虑您可能遇到的任何设置或维护成本。

结论
Hive 和 SQL 是处理(和驯服!)大数据的两种工具。 尽管这些工具有相似之处,但它们的差异足以保证进行比较。 我们认为 Hive 更适合分析复杂的数据集,而 SQL 更适用于不太复杂的数据集,并且在执行这些任务时速度更快。 另外,它是开源和免费的。 最终,适合您的工具取决于您如何分析组织中的大数据。

作者 east
Hadoop 4月 4,2022

Hadoop对比SQL,哪个更适合数据管理

Hadoop 与 SQL 之间的主要区别:

架构:Hadoop 是一个开源框架(或“生态系统”),它在计算机/服务器集群之间分布数据集并并行处理数据。 SQL 是一种特定领域的编程语言,用于处理关系数据库中的数据。


数据:Hadoop 一次写入数据; SQL 多次写入数据。 (Hadoop 和 SQL 多次读取数据。)


技能水平:Hadoop 比 SQL 更难学。 (但是,两者都需要代码知识。)


价格:Hadoop 和 SQL 是开源的并且可以免费使用。 但是,两者都会产生额外的设置和维护成本。


评论:Hadoop 在软件评论网站 G2.com 上的客户评分为 4.3/5。 因为 SQL 是一种编程语言,而不是作为“产品”提供,所以它在 G2 上没有得分。

组织依靠大数据为其业务提供动力,但许多团队都在为数据管理的复杂性而苦苦挣扎。 值得庆幸的是,Hadoop 和 SQL 更有效地处理大型数据集。 这些工具以独特的方式管理数据,这使得我们很难在同类的基础上比较它们。 但是,希望简化其技术堆栈的组织可能有理由选择其中一个。

在本文中,我们根据几个因素比较了 Hadoop 与 SQL,包括功能和客户评论分数。

什么是 Hadoop?
Apache Hadoop 是一个开源工具生态系统,可将数据集存储在分布式系统中并解决各种数据管理问题。

Hadoop 由四个组件组成:MapReduce、Yarn、库,以及最终在现成硬件上运行的 Hadoop 分布式文件系统 (HDFS)。 Hadoop 处理各种数据集,使其成为希望从大量来源生成有价值数据洞察的组织的绝佳选择。它有利于处理大量数据。

Hadoop 对跨计算机和服务器集群的数据集进行分布式处理。它以并行方式处理数据,因此它可以同时在多台机器上工作。 HDFS 存储提交的数据,MapReduce 处理数据,Yarn 划分数据管理任务。

世界上一些最成功的技术组织都使用 Hadoop,包括 IBM、Pivo​​tal Software、Hadapt 和 Amazon Web Services。

什么是 SQL?
结构化查询语言 (SQL) 是一种开源的特定于领域的编程语言,用于在 Oracle、SQL Server 或 MySQL 等关系数据库管理系统 (RDMS) 中进行数据管理和处理数据流。 SQL 由 Oracle 开发,是一种用于分析查询的声明性语言。

有关我们的原生 SQL 连接器的更多信息,请访问我们的集成页面。

Hadoop 与 SQL:有什么区别?
也许 Hadoop 和 SQL 之间最大的区别在于这些工具管理和集成数据的方式。 SQL 只能处理有限的数据集,例如关系数据,并且难以处理更复杂的数据集。 Hadoop 可以处理大型数据集和非结构化数据。

当然,还有很多其他的区别:

Hadoop 线性扩展; SQL 是非线性的。
Hadoop的完整性低; SQL 是高完整性的。
Hadoop只能写一次; SQL 多次写入。
Hadoop具有动态模式结构; SQL 具有静态模式结构。
Hadoop 支持批处理(通过 HDFS); SQL 没有。
Hadoop 比 SQL 更难学习,但更容易扩展。您可以轻松地将数据节点添加到 Hadoop 集群。
您选择的工具取决于您要管理的数据集。如果您需要处理大量数据,请选择 Hadoop。如果您不想要高级数据管理的复杂性,请选择 SQL。

作者 east
Spark 4月 3,2022

生产环境选型考虑:Spark和Tez有什么不同

让我们开始这场精彩的讨论。首先,退一步;我们已经指出 Apache Spark 和 Hadoop MapReduce 是两种不同的大数据利器。前者是高性能的内存数据处理框架,后者是成熟的PB级批处理平台。我们也知道 Apache Hive 和 HBase 是两个功能相似的非常不同的工具。 Hive 是运行 MapReduce 作业的类似 SQL 的引擎,而 HBase 是 Hadoop 上的 NoSQL 键/值数据库。

在纸面上,它们有很多共同点。两者都具有内存功能,都可以在 Hadoop YARN 之上运行,并且都支持来自任何数据源的所有数据类型。那么两者有什么区别呢?

Tez 非常适合 YARN 架构。 Spark 可能会遇到资源管理问题。

Spark 更适合主流开发人员,而 Tez 是专用工具的框架。

Spark 不能与 YARN 应用程序同时运行(目前)。 Tez 是专门为在 YARN 之上执行而构建的。

Tez 的容器可以在完成后关闭以节省资源。即使不处理数据,Spark 的容器也会占用资源。

这些只是高层次上的一些差异。在这里,我们将探索这些项目中的每一个。

什么是 Apache Spark?

Apache Spark 是一个用于处理大数据的开源分析引擎和集群计算框架。它是非营利性 Apache 软件基金会的创意,该基金会是一个致力于各种开源软件项目的去中心化组织。

它于 2014 年首次发布,基于 Hadoop MapReduce 分布式计算框架构建。它保留了 MapReduce 的许多优点——例如可扩展性和容错性——同时还提高了速度和易用性。

除了核心数据处理引擎,它还包括 SQL、机器学习和流处理库。该框架与 Java、Scala、Python 和 R 编程语言兼容,赢得了开发人员的广泛关注。它还支持第三方技术,如 Amazon S3、Hadoop 的 HDFS、MapR XD 和 NoSQL 数据库,如 Cassandra 和 MongoDB。

它的吸引力在于它能够将不同的流程、技术和技术整合到一个单一的大数据管道中,从而提高生产力和效率。由于其灵活性,它已成为大数据处理领域非常流行和有效的“瑞士军刀”。

什么是 Apache Tez?

Apache Tez 是一个基于 MapReduce 技术的大数据处理开源框架。两者都提供了一个执行引擎,可以使用有向无环图 (DAG) 来处理大量数据。

它通过将计算视为 DAG 来概括 MapReduce 范式。 MapReduce 任务组合成一个作业,该作业被视为 DAG 中的一个节点,执行并发和序列化。

同时,DAG 的边缘表示作业之间的数据移动。 Tez 与数据类型无关,因此它只关心数据的移动(而不是它采用的格式)。

通过改进 MapReduce 的一些限制,Tez 试图提高数据处理作业的性能。这种增加的效率使程序员能够做出他们认为最适合他们的项目的设计和开发选择。

Apache Spark 将自己标榜为“用于大规模数据处理的统一分析引擎”。同时,Apache Tez 称自己为“一个应用程序框架,它允许使用复杂的有向无环图来处理数据的任务”。

因为 Spark 也使用有向无环图,这两个工具听起来是不是很相似?可能是。但也有一些重要的区别需要考虑。以下是两者之间的根本区别:

差异#1:Hive和Pig

差异 #2:Hadoop YARN

差异#3:性能测试

我们将在下面的部分中详细介绍这些差异中的每一个。

他们支持Pig和Hive吗?

Hive 和 Pig 是两个用于大数据的开源 Apache 软件应用程序。 Hive 是一个数据仓库,而 Pig 是一个用于创建在 Hadoop 上运行的数据处理作业的平台。虽然两者都声称支持 Pig 和 Hive,但现实并不那么清楚。我们尝试使用 Spork 项目在 Spark 上运行 Pig,但遇到了一些问题;至少,在 Spark 上使用 Pig 充其量仍是不确定的。

使用YARN

YARN 是 Hadoop 的资源管理器和作业调度器。理论上,Spark 既可以作为独立应用程序执行,也可以在 YARN 之上执行。然而,Tez 是专门为在 YARN 之上执行而构建的。不过,Spark 不能与其他 YARN 应用程序同时运行(至少现在还不能)。

Tez 项目的开发人员之一 Gopal V 写了一篇关于他为什么喜欢 Tez 的详细文章。他的结论是:

“在我使用过的框架之间,这是 Tez 真正的区别特性——Tez 不需要容器保持运行来做任何事情,只需应用程序管理器在不同查询之间的空闲期间运行。您可以保留容器,但这是一种优化,而不是会话空闲期间的要求。”

他所说的“框架”也指 Spark——它的容器需要保持运行并占用资源,即使它们不处理任何数据。但是,Tez 容器可以在完成后立即关闭并释放资源。

大多数情况下,您无论如何都会使用基于 Hadoop 的应用程序,例如 Hive、HBase 甚至经典的 MapReduce。因此,您可以在任何 Hadoop 集群上安装 Spark,但您可能会遇到资源管理问题。另一方面,Tez 可以非常适合您的 YARN 架构,包括资源管理。

Apache Spark 的亮点:图形处理

GraphX 是扩展 Spark RDD 的图计算引擎。术语“图”是指图论中的图,而不是用于商业计算的图。图论中使用的图捕获数据之间的交互和依赖关系。

GraphX 最初是加州大学伯克利分校的一个研究项目。该项目后来被捐赠给了 Apache 软件基金会和 Spark 项目。

GraphX 不同于其他图计算引擎,因为它将图分析和 ETL 统一在一个平台上。 GraphX 还可以分析非图形形式的数据。其内存计算能力使 GraphX 比其他图形处理引擎更快。

图处理的常用场景

社交网络分析 – 用于识别影响者以进行目标营销

欺诈检测 – 银行、信用卡公司和在线商店使用图形分析来识别异常趋势。

供应链优化 – 公司可以使用图表分析来确定其供应链的最佳路线

贷款决策 – 抵押贷款公司和银行使用图表分析来评估申请人的数据以做出贷款决策。

Google 如何使用图形处理

Google 使用一种称为 PageRank 算法的图形分析算法。 PageRank 算法根据重要性对图中的顶点进行排名,其中重要性是指向该顶点的边数。该算法是由 Google 的创始人开发的,因此流行的搜索引擎是 PageRank 的一个典型例子。谷歌根据页面的重要性对页面进行排名,重要性是指向页面的超链接数量。

那么哪个更快?

也许最大的问题是——哪个更快?根据各种基准,这两个选项都显着提高了 MapReduce 性能;但是,获胜者可能取决于谁在进行测量。就独立第三方评估而言,陪审团仍未出局。

Spark 声称运行速度比 MapReduce 快 100 倍。在加州大学伯克利分校的 Amplab 进行的基准测试表明,它的运行速度比它的同类产品快得多(测试将 Spark 称为 Shark,它是 Spark SQL 的前身)。

然而,由于伯克利发明了 Spark,这些测试可能并非完全没有偏见。此外,这些基准测试是几年前使用运行在 MapReduce 上的 Hive 0.12 进行的。从版本 0.13 开始,Hive 使用 Tez 作为其执行引擎,从而显着提高了性能。

与此同时,Hortonworks 对两者之间的问题表现进行了基准测试。他们发现在 Tez 上运行的 Hive 0.13 的运行速度比 Hive 0.12 快 100 倍(尽管相当多的测试查询神秘地消失了)。快了 100 倍……嗯,听起来很熟悉?

因此,它们的性能都比 Hadoop MapReduce 高 100 倍。但哪个最快?

没有人可以说——或者更确切地说,他们不会承认。如果你问为 IBM 工作的人,他们会告诉你答案都不是,而且 IBM Big SQL 比两者都快。我们需要第三方来运行独立的性能测试并一劳永逸地确定分数。

小结:

这个问题最终可能归结为政治和受欢迎程度。这是大数据巨头的冲突,Cloudera 支持 Spark,Hortonworks 支持 Tez。 Spark 更为广泛,因为它可以在各种发行版中使用,而 Tez 仅在 Hortonworks 的发行版中可用。

最终,用户群可能决定框架的命运。目前,至少根据谷歌趋势,Spark 正在赢得这场比赛。

也许在炒作消退之后,在人们获得了更多与两者合作的经验之后,我们最终将能够判断谁将成为 MapReduce 王冠的继承人。

作者 east
大数据开发 4月 3,2022

大数据5种不同数据处理方式

随着商业环境的不断发展,公司越来越依赖于他们的数据。 但是,在您可以利用任何数据为公司谋取利益之前,您必须首先处理您收集的结构化和非结构化数据。

虽然最简单和最著名的数据处理形式是数据可视化,但有几种不同的数据处理方法通常用于与数据交互。

继续阅读以了解有关五种数据处理类型的更多信息,以及它们在可用性、原子性、并发性和其他因素方面的不同之处。

为什么数据处理方法很重要?

您采用的数据处理方法将决定查询的响应时间以及输出的可靠性。因此,需要谨慎选择方法。例如,在可用性至关重要的情况下,例如证券交易所门户,交易处理应该是首选方法。

重要的是要注意数据处理和数据处理系统之间的区别。数据处理是将数据转换为有用信息的规则。数据处理系统是针对特定类型的数据处理进行优化的应用程序。例如,分时系统旨在优化运行分时处理。它也可以用于运行批处理。但是,它不会很好地适应这项工作。

从这个意义上说,当我们谈论为您的需求选择正确的数据处理类型时,我们指的是选择正确的系统。以下是最常见的数据处理类型及其应用。

1. 事务处理

事务处理部署在关键任务情况下。这些情况一旦中断,将对业务运营产生不利影响。例如,如前所述,处理证券交易所交易。在事务处理中,可用性是最重要的因素。可用性可能受以下因素的影响:

硬件:事务处理系统应该有冗余硬件。硬件冗余允许部分故障,因为冗余组件可以自动接管并保持系统运行。

软件:事务处理系统的软件应设计为从故障中快速恢复。通常,事务处理系统使用事务抽象来实现这一点。简而言之,如果发生故障,未提交的事务将被中止。这允许系统快速重启。

2.分布式处理

很多时候,数据集太大而无法放在一台机器上。分布式数据处理分解这些大型数据集并将它们存储在多台机器或服务器上。它依赖于 Hadoop 分布式文件系统 (HDFS)。分布式数据处理系统具有高容错性。如果网络中的一台服务器出现故障,则可以将数据处理任务重新分配给其他可用的服务器。

分布式处理也可以极大地节省成本。企业不再需要建造昂贵的大型计算机并投资于维护和维护。

流处理和批处理是分布式处理的常见示例,下面将讨论这两者。

3.实时处理

实时处理类似于事务处理,因为它用于需要实时输出的情况。但是,两者在处理数据丢失的方式上有所不同。实时处理尽可能快地计算传入数据。如果它在输入数据中遇到错误,它会忽略错误并移动到下一个输入数据块。GPS 跟踪应用程序是实时数据处理的最常见示例。

将此与事务处理进行对比。如果出现错误,例如系统故障,事务处理将中止正在进行的处理并重新初始化。在近似答案就足够的情况下,实时处理优于事务处理。

在数据分析领域,流处理是实时数据处理的常见应用。流处理首先由 Apache Storm 推广,它在数据传入时对其进行分析。想想来自物联网传感器的数据,或实时跟踪消费者活动。 Google BigQuery 和 Snowflake 是采用实时处理的云数据平台的示例。

4.批处理

顾名思义,批处理就是将一段时间内存储的数据块一起或分批分析。当需要分析大量数据以获得详细见解时,需要进行批处理。例如,一个公司在一段时间内的销售数据通常会经过批处理。由于涉及大量数据,系统将需要时间来处理它。通过批量处理数据,可以节省计算资源。

当准确性比速度更重要时,批处理优于实时处理。此外,批处理的效率也以吞吐量来衡量。吞吐量是单位时间内处理的数据量。

5. 多并发处理

多并发处理是一种数据处理方法,其中两个或两个以上的处理器在同一数据集上工作。这听起来可能与分布式处理完全一样,但还是有区别的。在多处理中,不同的处理器驻留在同一系统中。因此,它们存在于相同的地理位置。如果出现组件故障,则会降低系统的速度。

另一方面,分布式处理使用彼此独立并且可以存在于不同地理位置的服务器。由于当今几乎所有系统都具有并行处理数据的能力,因此几乎每个数据处理系统都使用多处理。

但是,在本文的上下文中,可以将多处理视为具有本地数据处理系统。通常,处理非常敏感信息的公司可能会选择本地数据处理而不是分布式处理。例如,从事石油和天然气开采行业的制药公司或企业。

这种数据处理最明显的缺点是成本。构建和维护内部服务器非常昂贵。

作者 east
深度学习 4月 2,2022

Tensorflow:使用 GPU 进行 BERT 微调

训练数据的短缺是自然语言处理面临的最大挑战之一。 因为 NLP 是一个多元化的领域,在多语言数据中具有多种任务。 最特定于任务的数据集仅包含几千个训练数据,这不足以实现更好的准确性。

为了提高现代基于深度学习的 NLP 模型的性能,需要数百万或数十亿的训练数据。 研究人员已经开发出各种方法来使用网络上的大量未注释文本来训练通用语言表示模型。 这称为预训练。

这些预训练模型可用于为广泛的 NLP 任务(例如问答和测试分类)创建最先进的模型。 它被称为微调。 当我们没有足够数量的训练样本时,微调是有效的。

BERT

BERT 代表来自 Transformers 的双向编码器表示。 BERT 是由 Google AI 的研究人员推出的 NLP 框架。 它是一种新的预训练语言表示模型,可在各种自然语言处理 (NLP) 任务上获得最先进的结果。 只需添加单个输出层即可对预训练的 BERT 模型进行微调。 你可以在这里找到 BERT 的学术论文:https://arxiv.org/abs/1810.04805。

在本教程中,您将通过一个示例学习对 BERT 模型进行微调。 可以参考之前的 BERT 教程,里面已经解释了 BERT 模型的架构。

我们将使用 Kaggle 的 Quora Insincere Questions Classification 任务数据进行演示。

In [1]:
# Let's load the required packages
import pandas as pd
import numpy as np
import datetime
import zipfile
import sys
import os

下载预训练的 BERT 模型以及模型权重和配置文件

In [2]: !wget storage.googleapis.com/bert_models/2018_10_18/uncased_L-12_H-768_A-12.zip

提取下载的模型 zip 文件。

In [3]:
repo = 'model_repo'
if not os.path.exists(repo):
    print("Dir created!")
    os.mkdir(repo)
with zipfile.ZipFile("uncased_L-12_H-768_A-12.zip","r") as zip_ref:
    zip_ref.extractall(repo)
In [4]:
BERT_MODEL = 'uncased_L-12_H-768_A-12'
BERT_PRETRAINED_DIR = f'{repo}/uncased_L-12_H-768_A-12'

OUTPUT_DIR = f'{repo}/outputs'
if not os.path.exists(OUTPUT_DIR):
    os.makedirs(OUTPUT_DIR)

print(f'***** Model output directory: {OUTPUT_DIR} *****')
print(f'***** BERT pretrained directory: {BERT_PRETRAINED_DIR} *****') 

Out[4]:
***** Model output directory: model_repo/outputs *****
***** BERT pretrained directory: model_repo/uncased_L-12_H-768_A-12 *****

准备和导入 BERT 模块

以下 BERT 模块是从 GitHub 克隆源代码并导入模块。

In [5]:
# Download the BERT modules
!wget raw.githubusercontent.com/google-research/bert/master/modeling.py 
!wget raw.githubusercontent.com/google-research/bert/master/optimization.py 
!wget raw.githubusercontent.com/google-research/bert/master/run_classifier.py 
!wget raw.githubusercontent.com/google-research/bert/master/tokenization.py
!wget raw.githubusercontent.com/google-research/bert/master/run_classifier_with_tfhub.py
In [6]: # Import BERT modules 
import modeling 
import optimization 
import run_classifier 
import tokenization 
import tensorflow as tf 
import run_classifier_with_tfhub

准备训练数据

在这里,我们将在一小部分训练数据上训练 BERT 模型。

In [7]:
from sklearn.model_selection import train_test_split

train_df =  pd.read_csv('input/train.csv')
train_df = train_df.sample(2000)                 # Train on 2000 data

train, val = train_test_split(train_df, test_size = 0.1, random_state=42)

train_lines, train_labels = train.question_text.values, train.target.values
val_lines, val_labels = val.question_text.values, val.target.values

label_list = ['0', '1']
In [8]:
def create_examples(lines, set_type, labels=None):
    guid = f'{set_type}'
    examples = []
    if guid == 'train':
        for line, label in zip(lines, labels):
            text_a = line
            label = str(label)
            examples.append(
              run_classifier.InputExample(guid=guid, text_a=text_a, text_b=None, label=label))
    else:
        for line in lines:
            text_a = line
            label = '0'
            examples.append(
              run_classifier.InputExample(guid=guid, text_a=text_a, text_b=None, label=label))
    return examples

指定 BERT 预训练模型。

这里使用的是 uncased_L-12_H-768_A-12 型号。 该模型由12层、768个隐藏、12个头、110M个参数组成。 它是一个 Uncased 模型,这意味着文本在标记化之前已被小写。

In [9]:
BERT_MODEL = 'uncased_L-12_H-768_A-12' 
BERT_MODEL_HUB = 'https://tfhub.dev/google/bert_' + BERT_MODEL + '/1'

初始化模型超参数。

In [10]:
TRAIN_BATCH_SIZE = 32
EVAL_BATCH_SIZE = 8
LEARNING_RATE = 2e-5
NUM_TRAIN_EPOCHS = 3.0
WARMUP_PROPORTION = 0.1
MAX_SEQ_LENGTH = 128

# Model Configuration
SAVE_CHECKPOINTS_STEPS = 1000 
ITERATIONS_PER_LOOP = 1000
NUM_TPU_CORES = 8

VOCAB_FILE = os.path.join(BERT_PRETRAINED_DIR, 'vocab.txt')
CONFIG_FILE = os.path.join(BERT_PRETRAINED_DIR, 'bert_config.json')
INIT_CHECKPOINT = os.path.join(BERT_PRETRAINED_DIR, 'bert_model.ckpt')
DO_LOWER_CASE = BERT_MODEL.startswith('uncased')

tpu_cluster_resolver = None   # Model trained on GPU, we won't need a cluster resolver

def get_run_config(output_dir):
    return tf.contrib.tpu.RunConfig(
    cluster=tpu_cluster_resolver,
    model_dir=output_dir,
    save_checkpoints_steps=SAVE_CHECKPOINTS_STEPS,
    tpu_config=tf.contrib.tpu.TPUConfig(
        iterations_per_loop=ITERATIONS_PER_LOOP,
        num_shards=NUM_TPU_CORES,
        per_host_input_for_training=tf.contrib.tpu.InputPipelineConfig.PER_HOST_V2))

加载分词器模块

注意:当您使用 Cased 模型时,传递 do_lower_case = False。

In [11]:
tokenizer = tokenization.FullTokenizer(vocab_file=VOCAB_FILE, do_lower_case=DO_LOWER_CASE)
train_examples = create_examples(train_lines, 'train', labels=train_labels)

# compute number of train and warmup steps from batch size
num_train_steps = int( len(train_examples) / TRAIN_BATCH_SIZE * NUM_TRAIN_EPOCHS)
num_warmup_steps = int(num_train_steps * WARMUP_PROPORTION)

微调来自 TF Hub 的预训练 BERT 模型

本节说明了来自 TensorFlow 集线器模块的微调预训练 BERT 模型。

In [12]:

model_fn = run_classifier_with_tfhub.model_fn_builder(
  num_labels=len(label_list),
  learning_rate=LEARNING_RATE,
  num_train_steps=num_train_steps,
  num_warmup_steps=num_warmup_steps,
  use_tpu=False,
  bert_hub_module_handle=BERT_MODEL_HUB
)

estimator_from_tfhub = tf.contrib.tpu.TPUEstimator(
  use_tpu=False,    #If False training will fall on CPU or GPU
  model_fn=model_fn,
  config=get_run_config(OUTPUT_DIR),
  train_batch_size=TRAIN_BATCH_SIZE,
  eval_batch_size=EVAL_BATCH_SIZE,
)
In [13]:
# Train the model
def model_train(estimator):
    print('Please wait...')
    train_features = run_classifier.convert_examples_to_features(
      train_examples, label_list, MAX_SEQ_LENGTH, tokenizer)
    print('***** Started training at {} *****'.format(datetime.datetime.now()))
    print('  Num examples = {}'.format(len(train_examples)))
    print('  Batch size = {}'.format(TRAIN_BATCH_SIZE))
    tf.logging.info("  Num steps = %d", num_train_steps)
    train_input_fn = run_classifier.input_fn_builder(
      features=train_features,
      seq_length=MAX_SEQ_LENGTH,
      is_training=True,
      drop_remainder=True)
    estimator.train(input_fn=train_input_fn, max_steps=num_train_steps)
    print('***** Finished training at {} *****'.format(datetime.datetime.now()))
In [14]: model_train(estimator_from_tfhub)
In [15]:
# Evaluate the model
def model_eval(estimator):
    
    eval_examples = create_examples(val_lines, 'test')
    
    eval_features = run_classifier.convert_examples_to_features(
        eval_examples, label_list, MAX_SEQ_LENGTH, tokenizer)
        
    print('***** Started evaluation at {} *****'.format(datetime.datetime.now()))
    print('  Num examples = {}'.format(len(eval_examples)))
    print('  Batch size = {}'.format(EVAL_BATCH_SIZE))
    
    eval_steps = int(len(eval_examples) / EVAL_BATCH_SIZE)
    
    eval_input_fn = run_classifier.input_fn_builder(
      features=eval_features,
      seq_length=MAX_SEQ_LENGTH,
      is_training=False,
      drop_remainder=True)
    
    result = estimator.evaluate(input_fn=eval_input_fn, steps=eval_steps)
    
    print('***** Finished evaluation at {} *****'.format(datetime.datetime.now()))
    
    print("***** Eval results *****")
    for key in sorted(result.keys()):
        print('  {} = {}'.format(key, str(result[key])))
In [16]: model_eval(estimator_from_tfhub)

从检查点微调预训练的 BERT 模型

您还可以从保存的检查点加载预训练的 BERT 模型。

In [17]:
CONFIG_FILE = os.path.join(BERT_PRETRAINED_DIR, 'bert_config.json')
INIT_CHECKPOINT = os.path.join(BERT_PRETRAINED_DIR, 'bert_model.ckpt')

OUTPUT_DIR = f'{repo}/outputs_checkpoints'
if not os.path.exists(OUTPUT_DIR):
    os.makedirs(OUTPUT_DIR)

model_fn = run_classifier.model_fn_builder(
    bert_config=modeling.BertConfig.from_json_file(CONFIG_FILE),
    num_labels=len(label_list),
    init_checkpoint=INIT_CHECKPOINT,
    learning_rate=LEARNING_RATE,
    num_train_steps=num_train_steps,
    num_warmup_steps=num_warmup_steps,
    use_tpu=False, #If False training will fall on CPU or GPU, 
    use_one_hot_embeddings=True)

estimator_from_checkpoints = tf.contrib.tpu.TPUEstimator(
    use_tpu=False,
    model_fn=model_fn,
    config=get_run_config(OUTPUT_DIR),
    train_batch_size=TRAIN_BATCH_SIZE,
    eval_batch_size=EVAL_BATCH_SIZE)
In [18]: 
# Train the Model
model_train(estimator_from_checkpoints)
# Evaluate the Model
In [19]: model_eval(estimator_from_checkpoints)
作者 east
深度学习 4月 2,2022

BERT:如何处理长文档

BERT 的问题

BERT,即 Transformers 的双向编码器表示,目前是公众可以使用的最著名的预训练语言模型之一。事实证明,它在包括问答和分类在内的各种任务中非常有用。

但是,BERT 最多只能接受长度为 512 个标记的输入序列。这是一个很大的限制,因为许多常见的文档类型都比 512 个单词长得多。在这一点上,我们将解释和比较一些方法来克服这个限制,并使您更容易使用 BERT 处理更长的输入文档。

为什么 BERT 不能处理长文档?

BERT 继承了转换器的架构,转换器本身使用自注意力、前馈层、残差连接和层规范化作为其基础组件。如果您不熟悉变压器架构,您可以阅读Deep Learning 101: What is a Transformer and Why Should I Care? 在继续读本文之前。

bertarchitecture.png

BERT 和长输入文档的问题源于 BERT 架构的几个领域。

Transformer 本身是自回归的,BERT 的创建者指出,当使用超过 512 个令牌的文档时,性能会显着下降。所以,这个限制是为了防止低质量的输出。
自注意力模型的空间复杂度为 O(n²)。像这样的二次复杂性使得这些模式非常耗费资源进行微调。输入的时间越长,微调模型所需的资源就越多。二次复杂度使大多数用户的成本高得令人望而却步。
鉴于上述两点,BERT 使用基于较短输入序列的位置编码进行了预训练。这意味着该模型不能很好地推广到更长的序列,并且为收益递减而进行微调的费用意味着解决这个问题的方法有限。
但是我的文件很长,那我现在该怎么办?

幸运的是,您可以做一些事情来有效地使用 BERT 处理更长的输入文档。这里有一些经过验证的技术可以尝试。

修整输入序列

这可能是处理 BERT 和长输入文档时最常用的技术。鉴于 BERT 对多达 512 个令牌的文档表现良好,只需将较长的文档拆分为 512 个令牌块即可让您将长文档分段传递。

对于较长的连续文档(例如长新闻文章或研究论文),将完整长度的文档切成 512 个字块不会造成任何问题,因为文档本身组织良好并且专注于单个主题。但是,如果您的文本块不太连续(例如聊天机器人脚本或一系列推文),则中间可能有与核心主题无关的块。

平均段输出的投票

另一种常见的技术是将长文档分成相等长度的重叠段,并使用投票机制进行分类。这将缓解诸如对话记录之类的非连续文档所带来的问题。使用来自较大文档的各个块的投票将合并来自整个事物的信息。

这在实践中的工作方式是将文档分成段,并通过 BERT 运行每个段,以获得分类 logits。然后通过组合投票(每段一个),我们可以得到一个平均值,我们将其作为最终分类。

这里的缺点是你不能在任务上微调 BERT,因为损失是不可微的。即使存在重叠,您也会错过每个段之间的一些共享信息。这可能会产生特定于分析管道架构的下游影响。

结论

对长输入文档使用 BERT 取决于您的具体任务。有一些更新的模型——比如 RoBERTa——是为了解决 BERT 的弱点而创建的。我们将在以后的帖子中更多地讨论这些内容。对于需要来自整个文档的信息的复杂任务,或者您使用的是非连续文档,使用像 RoBERTa 这样的 BERT 变体可能是最佳解决方案。

作者 east

上一 1 2

关注公众号“大模型全栈程序员”回复“小程序”获取1000个小程序打包源码。回复”chatgpt”获取免注册可用chatgpt。回复“大数据”获取多本大数据电子书

标签

AIGC AI创作 bert chatgpt github GPT-3 gpt3 GTP-3 hive mysql O2O tensorflow UI控件 不含后台 交流 共享经济 出行 图像 地图定位 外卖 多媒体 娱乐 小程序 布局 带后台完整项目 开源项目 搜索 支付 效率 教育 日历 机器学习 深度学习 物流 用户系统 电商 画图 画布(canvas) 社交 签到 联网 读书 资讯 阅读 预订

官方QQ群

小程序开发群:74052405

大数据开发群: 952493060

近期文章

  • 详解Python当中的pip常用命令
  • AUTOSAR如何在多个供应商交付的配置中避免ARXML不兼容?
  • C++thread pool(线程池)设计应关注哪些扩展性问题?
  • 各类MCAL(Microcontroller Abstraction Layer)如何与AUTOSAR工具链解耦?
  • 如何设计AUTOSAR中的“域控制器”以支持未来扩展?
  • C++ 中避免悬挂引用的企业策略有哪些?
  • 嵌入式电机:如何在低速和高负载状态下保持FOC(Field-Oriented Control)算法的电流控制稳定?
  • C++如何在插件式架构中使用反射实现模块隔离?
  • C++如何追踪内存泄漏(valgrind/ASan等)并定位到业务代码?
  • C++大型系统中如何组织头文件和依赖树?

文章归档

  • 2025年6月
  • 2025年5月
  • 2025年4月
  • 2025年3月
  • 2025年2月
  • 2025年1月
  • 2024年12月
  • 2024年11月
  • 2024年10月
  • 2024年9月
  • 2024年8月
  • 2024年7月
  • 2024年6月
  • 2024年5月
  • 2024年4月
  • 2024年3月
  • 2023年11月
  • 2023年10月
  • 2023年9月
  • 2023年8月
  • 2023年7月
  • 2023年6月
  • 2023年5月
  • 2023年4月
  • 2023年3月
  • 2023年1月
  • 2022年11月
  • 2022年10月
  • 2022年9月
  • 2022年8月
  • 2022年7月
  • 2022年6月
  • 2022年5月
  • 2022年4月
  • 2022年3月
  • 2022年2月
  • 2022年1月
  • 2021年12月
  • 2021年11月
  • 2021年9月
  • 2021年8月
  • 2021年7月
  • 2021年6月
  • 2021年5月
  • 2021年4月
  • 2021年3月
  • 2021年2月
  • 2021年1月
  • 2020年12月
  • 2020年11月
  • 2020年10月
  • 2020年9月
  • 2020年8月
  • 2020年7月
  • 2020年6月
  • 2020年5月
  • 2020年4月
  • 2020年3月
  • 2020年2月
  • 2020年1月
  • 2019年7月
  • 2019年6月
  • 2019年5月
  • 2019年4月
  • 2019年3月
  • 2019年2月
  • 2019年1月
  • 2018年12月
  • 2018年7月
  • 2018年6月

分类目录

  • Android (73)
  • bug清单 (79)
  • C++ (34)
  • Fuchsia (15)
  • php (4)
  • python (43)
  • sklearn (1)
  • 云计算 (20)
  • 人工智能 (61)
    • chatgpt (21)
      • 提示词 (6)
    • Keras (1)
    • Tensorflow (3)
    • 大模型 (1)
    • 智能体 (4)
    • 深度学习 (14)
  • 储能 (44)
  • 前端 (4)
  • 大数据开发 (488)
    • CDH (6)
    • datax (4)
    • doris (30)
    • Elasticsearch (15)
    • Flink (78)
    • flume (7)
    • Hadoop (19)
    • Hbase (23)
    • Hive (40)
    • Impala (2)
    • Java (71)
    • Kafka (10)
    • neo4j (5)
    • shardingsphere (6)
    • solr (5)
    • Spark (99)
    • spring (11)
    • 数据仓库 (9)
    • 数据挖掘 (7)
    • 海豚调度器 (10)
    • 运维 (34)
      • Docker (3)
  • 小游戏代码 (1)
  • 小程序代码 (139)
    • O2O (16)
    • UI控件 (5)
    • 互联网类 (23)
    • 企业类 (6)
    • 地图定位 (9)
    • 多媒体 (6)
    • 工具类 (25)
    • 电商类 (22)
    • 社交 (7)
    • 行业软件 (7)
    • 资讯读书 (11)
  • 嵌入式 (70)
    • autosar (63)
    • RTOS (1)
    • 总线 (1)
  • 开发博客 (16)
    • Harmony (9)
  • 技术架构 (6)
  • 数据库 (32)
    • mongodb (1)
    • mysql (13)
    • pgsql (2)
    • redis (1)
    • tdengine (4)
  • 未分类 (6)
  • 程序员网赚 (20)
    • 广告联盟 (3)
    • 私域流量 (5)
    • 自媒体 (5)
  • 量化投资 (4)
  • 面试 (14)

功能

  • 登录
  • 文章RSS
  • 评论RSS
  • WordPress.org

All Rights Reserved by Gitweixin.本站收集网友上传代码, 如有侵犯版权,请发邮件联系yiyuyos@gmail.com删除.